ターゲットがファイルではなくシンボリックリンクであることを知っているとすると、rm
とunlink
を使用してリンクを削除することに違いはありますか?
POSIXは、unlink
ユーティリティがCライブラリのunlink
関数のみを呼び出すことを指定しています。オプションはありません。ディレクトリではないものに有効なパス名を渡し、そのオブジェクトが存在するディレクトリへの書き込み権限がある場合、unlink
はそれを削除します。
rm
は、他のビット機能を備えた従来のUnixコマンドであり、unlink
のスーパーセットではありません(以下を参照)。
まず、rm
は安全性チェックを実行します。書き込み権限がないオブジェクトをrm
しようとした場合(オブジェクトを削除する機能には関係ありません。それを含むディレクトリの権限は!)rm
それでも_-f
_が指定されています。 rm
は通常、ファイルが存在しない場合に文句を言います。unlink
も同様です。ただし、_-f
_では、rm
は文句を言いません。これは、Makefiles(clean: @rm -f $(OBJS) ...
)で悪用されることが多いため、削除するものが何もない場合でも_make clean
_は失敗しません。
次に、rm
には、インタラクティブに削除を確認するための_-i
_オプションがあります。
第3に、rm
には、ディレクトリを再帰的に削除するための_-r
_があります。これは、Cライブラリ関数がそれを行わないため、unlink
が行う必要のないことです。
unlink
ユーティリティは、完全に削除されたrm
ではありません。rm
が行うことのサブセットを実行しますが、 rm
with _-f
_とrm without _-f
_の組み合わせ。
独自の権限に関係なく、通常のファイルを削除したいとします。さらに、ファイルが存在しない場合、またはその他の理由でコマンドを失敗させたい場合どちらでもない_rm file
_も_rm -f file
_も要件を満たしていません。 _rm file
_は、ファイルが書き込み可能でない場合、拒否します。しかし、_rm -f file
_は、ファイルが欠落している場合でも文句を言うことを怠ります。 _unlink file
_が仕事をします。
unlink
はおそらくrm
が賢すぎるために導入されました:純粋なUnixが必要な場合がありますunlink
セマンティクス: "このディレクトリエントリを作成してくださいディレクトリのアクセス許可で許可されている場合は削除してください "。
単一ファイルの場合、 rm および unlink は同じタスクを実行し、ファイルを削除します。 POSIXで定義されているように、rm
とunlink
はどちらも unlink() システムコールを呼び出します。
GNU rm
では、 unlinkat() システムコールを呼び出します。これはunlink()
または rmdir() 関数は、パスが相対パスを指定する場合を除きます。
注
一部のシステムでは、unlink
もディレクトリを削除できます。少なくともGNUシステムでは、unlink
はディレクトリの名前を削除できません。