「rm」と「接続解除」の違いは何ですか?

「rm」と「接続解除」の違いは何ですか?

ターゲットがファイルではなくシンボリックリンクであることを知っていると仮定すると、リンクの使用と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()で頻繁に悪用されるため、削除するものがないと失敗しません。-frmclean: @rm -f $(OBJS) ...make clean

第二に、インタラクティブに削除を確認するオプションがrmあります。-i

第三に、ディレクトリをrm再帰的に削除します。これは、Cライブラリ関数が実行しないために実行する必要がない作業です。-runlink

このunlinkユーティリティは厳密に言えば単純なユーティリティではありませんrm機能のサブセットを実行しますrmが、意味は次の組み合わせです。rm そして -fそしてrmいいえ -f

独自の権限に関係なく、一般ファイルを削除したいとしましょう。また、ファイルが存在しない場合や、他の理由でコマンドが失敗したい場合もあります。 要件を満たしていなくてもrm file要件rm -f fileを満たしていません。rm fileファイルに書き込めない場合は拒否されます。ただしrm -f file、ファイルが欠落している場合、苦情は無視されます。unlink fileタスクを実行します。

unlinkおそらくとても賢いので導入されましたrm。時には純粋なUnixセマンティクスが欲しいかもしれませんunlink「ディレクトリ権限が許可されると、このディレクトリエントリが消えます。」

答え3

単一のファイルを使用し、RMそして解く同じことを行い、ファイルを削除します。 POSIXの定義によると、rm両方をunlink呼び出します。解く()システムコール。

GNU では、rm以下を呼び出します。解く()unlink()または同等のシステムコールrmdir()関数。ただし、 path が相対パスを指定する場合は除外されます。

ノート

一部のシステムでは、unlinkディレクトリを削除することもできます。少なくとも GNU システムではunlinkディレクトリ名を削除できません。

答え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

関連情報