ターゲットがファイルではなくシンボリックリンクであることを知っていると仮定すると、リンクの使用とrm
削除のunlink
間に違いはありますか?
答え1
このような問題が発生するたびに、実際に何が起こっているのかを確認するために小さなテストを実行することをお勧めします。このためにstrace
。
解く
$ touch file1
$ strace -s 2000 -o unlink.log unlink file1
RM
$ 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()
http://linux.die.net/man/2/unlinkat。
unlinkat() システムコールは、このマニュアルページで説明されている違いを除いて、unlink(2) または rmdir(2) (フラグに AT_REMOVEDIR フラグが含まれているかどうかに依存します) とまったく同じように動作します。
pathnameに指定されたパス名が相対パスである場合は、ファイル記述子dirfdが参照するディレクトリに基づいて解釈されます(unlink(2)とrmdir(2が実行するように、呼び出しプロセスの現在の作業ディレクトリに基づいていない))。相対パス名を表します)。
pathnameに与えられたパス名が相対的でdirfdが特別な値AT_FDCWDの場合、pathnameは呼び出しプロセスの現在の作業ディレクトリに基づいて解釈されます(unlink(2)とrmdir(2)のように)。
pathnameに与えられたパス名が絶対パス名である場合、dirfdは無視されます。
答え2
POSIXは、unlink
ユーティリティがCライブラリunlink
関数のみを呼び出し、他の関数を呼び出さないことを指定します。選択の余地がない。ディレクトリ以外のパスに有効なパス名を渡し、オブジェクトが存在するディレクトリに対する書き込み権限がある場合、unlink
そのオブジェクトは削除されます。
rm
はいくつかの追加機能を持ち、親セットではなく伝統的なUnixコマンドですunlink
(下記参照)。
1つ目はrm
安全チェックを行うことです。書き込み権限なしでオブジェクトにアクセスしようとするとrm
(削除機能とは関係ありません。インクルードディレクトリの権限は次のとおりです)、指定しない限り、そのオブジェクトrm
は-f
まだ拒否されます。rm
ファイルがなければ一般的に文句がありますが、unlink
あれば文句はありません。これはMakefiles()で頻繁に悪用されるため、削除するものがないと失敗しません。-f
rm
clean: @rm -f $(OBJS) ...
make clean
第二に、インタラクティブに削除を確認するオプションがrm
あります。-i
第三に、ディレクトリをrm
再帰的に削除します。これは、Cライブラリ関数が実行しないために実行する必要がない作業です。-r
unlink
このunlink
ユーティリティは厳密に言えば単純なユーティリティではありませんrm
。機能のサブセットを実行しますrm
が、意味は次の組み合わせです。rm
そして -f
そしてrmいいえ -f
。
独自の権限に関係なく、一般ファイルを削除したいとしましょう。また、ファイルが存在しない場合や、他の理由でコマンドが失敗したい場合もあります。 要件を満たしていなくてもrm file
要件rm -f file
を満たしていません。rm file
ファイルに書き込めない場合は拒否されます。ただしrm -f file
、ファイルが欠落している場合、苦情は無視されます。unlink file
タスクを実行します。
unlink
おそらくとても賢いので導入されましたrm
。時には純粋なUnixセマンティクスが欲しいかもしれませんunlink
。「ディレクトリ権限が許可されると、このディレクトリエントリが消えます。」。
答え3
答え4
また、rmを使用すると、globを使用して複数のファイルを削除できます。接続を解除すると、一度に 1 つずつファイルを削除できます。
touch f{1..10}
rm f* # works
touch f{1..10}
unlink f* # doesn't work (expands to unlink f1 f2 ... f10)
unlink f1 # works