ターゲットがファイルではなくシンボリックリンクであることを知っていると仮定すると、リンクの使用rm
とunlink
削除に違いはありますか?
ターゲットがファイルではなくシンボリックリンクであることを知っていると仮定すると、リンクの使用rm
とunlink
削除に違いはありますか?
回答:
この種の質問があるときはいつでも、実際に何が起こっているのかを確認するための小さなテストを考えるのが最善です。このために使用できますstrace
。
$ touch file1
$ strace -s 2000 -o unlink.log unlink file1
$ touch file1
$ strace -s 2000 -o rm.log rm file1
結果の2つのログファイルを見ると、各呼び出しが実際に行っていることを「見る」ことができます。
unlink
それが呼び出すだunlink()
システムコールを:
....
mmap(NULL, 106070960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6d025cc000
close(3) = 0
unlink("file1") = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
....
rm
それはわずかに異なるパスです。
....
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
geteuid() = 1000
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
faccessat(AT_FDCWD, "file1", W_OK) = 0
unlinkat(AT_FDCWD, "file1", 0) = 0
lseek(0, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
close(0) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
...
システムコールunlink()
とはunlinkat()
:基本的に、このmanページで説明している違いがある以外は同じですhttp://linux.die.net/man/2/unlinkat。
unlinkat()システムコールは、このマニュアルページで説明されている違いを除いて、unlink(2)またはrmdir(2)(flagsにAT_REMOVEDIRフラグが含まれているかどうかによって異なります)とまったく同じように動作します。
pathnameで指定されたパス名が相対である場合、(unlink(2)およびrmdir(2 )相対パス名の場合)。
pathnameで指定されたパス名が相対であり、dirfdが特別な値AT_FDCWDである場合、pathnameは呼び出しプロセスの現在の作業ディレクトリ(unlink(2)やrmdir(2)など)を基準にして解釈されます。
pathnameで指定されたパス名が絶対パスの場合、dirfdは無視されます。
AT_FDCWD
、実質的にとの間に違いはunlink
ありませんunlinkat
。
POSIXは、unlink
ユーティリティがCライブラリunlink
関数を呼び出すことを指定します。オプションはありません。ディレクトリではないものに有効なパス名を渡し、そのオブジェクトが存在するディレクトリへの書き込み権限がある場合、それunlink
を削除します。
rm
は、他の機能を少し備えた従来のUnixコマンドであり、完全なスーパーセットではありませんunlink
(以下を参照)。
まず、rm
安全性チェックを実行します。あなたがしようとした場合rm
(!それを削除するあなたの能力には無関係である:直接権限がある)あなたが書き込み権限を持っていない先のオブジェクトrm
がない限り、それにもかかわらず拒否する-f
指定されています。 rm
通常、ファイルが存在しない場合は文句を言いますunlink
; しかし、で-f
、rm
文句を言いません。これはMakefile(clean: @rm -f $(OBJS) ...
)で悪用されることが多いためmake clean
、削除するものがない場合に失敗することはありません。
第二に、削除をインタラクティブに確認するオプションrm
があり-i
ます。
第三に、rm
持っている-r
再帰的なものであるディレクトリ、除去のためのunlink
Cライブラリ関数は、それをしないことから、やるする必要はありませんが。
このunlink
ユーティリティは、完全に削除されたものではありませんrm
。実行することのサブセットを実行しますが、withとrm withoutのrm
組み合わせであるセマンティクスを持ちます。rm
-f
-f
独自のアクセス許可に関係なく、通常のファイルを削除するだけだとします。さらに、ファイルが存在しない場合、またはその他の理由でコマンドを失敗させたいとします。 どちらrm file
もrm -f file
要件を満たしていません。rm file
ファイルが書き込み可能でない場合は拒否します。しかしrm -f file
、ファイルが欠落している場合に文句を言うのを怠ります。unlink file
仕事をします。
unlink
ので、おそらく導入されたrm
、時にはあなただけの純粋なUnixの希望:あまりにも巧妙であるunlink
セマンティクスを:「ディレクトリのパーミッションが許可した場合、このディレクトリエントリが離れて行くにしてください」。
unlink
。