Angenommen, Sie wissen, dass es sich bei dem Ziel um einen symbolischen Link und nicht um eine Datei handelt. Gibt es einen Unterschied zwischen der Verwendung rm
und unlink
dem Entfernen des Links?
Angenommen, Sie wissen, dass es sich bei dem Ziel um einen symbolischen Link und nicht um eine Datei handelt. Gibt es einen Unterschied zwischen der Verwendung rm
und unlink
dem Entfernen des Links?
Antworten:
Wann immer Sie diese Art von Fragen haben, ist es am besten, sich einen kleinen Test auszudenken, um zu sehen, was tatsächlich passiert. Dafür können Sie verwenden strace
.
$ touch file1
$ strace -s 2000 -o unlink.log unlink file1
$ touch file1
$ strace -s 2000 -o rm.log rm file1
Wenn Sie sich die 2 resultierenden Protokolldateien ansehen, können Sie "sehen", was jeder Anruf tatsächlich tut.
Mit unlink
dem Aufruf des unlink()
Systemaufrufs:
....
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) = ?
....
Mit rm
es ist ein etwas anderer Weg:
....
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 +++
...
Die Systemaufrufe unlink()
und unlinkat()
sind im Wesentlichen gleich mit Ausnahme der Unterschiede in dieser Manpage beschrieben: http://linux.die.net/man/2/unlinkat .
Der Systemaufruf unlinkat () funktioniert genauso wie entweder unlink (2) oder rmdir (2) (abhängig davon, ob Flags das AT_REMOVEDIR-Flag enthalten oder nicht), mit Ausnahme der in dieser Handbuchseite beschriebenen Unterschiede.
Wenn der in pathname angegebene Pfadname relativ ist, wird er relativ zum Verzeichnis interpretiert, auf das der Dateideskriptor dirfd verweist (und nicht relativ zum aktuellen Arbeitsverzeichnis des aufrufenden Prozesses, wie dies bei unlink (2) und rmdir (2) der Fall ist ) für einen relativen Pfadnamen).
Wenn der in pathname angegebene Pfadname relativ und dirfd der Sonderwert AT_FDCWD ist, wird pathname relativ zum aktuellen Arbeitsverzeichnis des aufrufenden Prozesses interpretiert (wie unlink (2) und rmdir (2)).
Wenn der in pathname angegebene Pfadname absolut ist, wird dirfd ignoriert.
AT_FDCWD
, gibt es praktisch keinen Unterschied zwischen unlink
und unlinkat
.
POSIX gibt an, dass das unlink
Dienstprogramm die C-Bibliotheksfunktion unlink
und nichts anderes aufruft . Es geht nicht anders. Wenn Sie einen gültigen Pfadnamen an etwas übergeben, das kein Verzeichnis ist, und wenn Sie über Schreibberechtigungen für das Verzeichnis verfügen, in dem sich das Objekt befindet, unlink
wird es entfernt.
rm
ist ein traditioneller Unix-Befehl, der über einige andere Funktionen verfügt und keine Obermenge von unlink
(siehe unten) darstellt.
Führt zunächst rm
Sicherheitsprüfungen durch. Wenn Sie versuchen, auf rm
ein Objekt zuzugreifen, für das Sie keine Schreibrechte haben (die für Ihre Fähigkeit, es zu entfernen, unerheblich sind: die direkten Berechtigungen sind!), Wird dies rm
dennoch abgelehnt, sofern nichts -f
anderes angegeben ist. rm
beschwert sich normalerweise, wenn die Datei nicht existiert, wie es der Fall ist unlink
; aber mit -f
, rm
beschwert sich nicht. Dies wird oft in Makefiles ( clean: @rm -f $(OBJS) ...
) ausgenutzt, so dass make clean
es nicht fehlschlägt, wenn nichts zu entfernen ist.
Zweitens rm
hat die -i
Option zur interaktiven Bestätigung des Löschvorgangs.
Drittens rm
muss -r
ein Verzeichnis rekursiv entfernt werden, was unlink
nicht erforderlich ist, da die C-Bibliotheksfunktion dies nicht tut.
Das unlink
Dienstprogramm ist nicht gerade ein abgespecktes rm
. Es führt eine Teilmenge dessen durch, was es rm
tut, aber es hat eine Semantik, die eine Kombination von rm
mit -f
und ohne rm ist -f
.
Angenommen, Sie möchten nur eine reguläre Datei entfernen, unabhängig von ihren eigenen Berechtigungen. Angenommen, der Befehl schlägt fehl, wenn die Datei nicht vorhanden ist, oder aus einem anderen Grund. Weder erfüllt rm file
noch rm -f file
die Anforderungen. rm file
lehnt ab, wenn die Datei nicht beschreibbar ist. Werde rm -f file
mich aber nicht beschweren, wenn die Datei fehlt. unlink file
macht den Job.
unlink
wurde wahrscheinlich eingeführt , weil rm
zu klug ist: manchmal nur die reine Sie Unix wollen unlink
: Semantik „ wenn Verzeichnisberechtigungen erlauben Sie diesen Verzeichniseintrag weggehen“ .
unlink
Unterschiede nicht nur zu beschreiben.
Mit einer einzelnen Datei erledigen rm und unlink dieselbe Aufgabe, entfernen Sie die Datei. Wie in POSIX definiert, rm
und unlink
beide rufen den Systemaufruf unlink () auf.
In GNU rm
ruft es den Systemaufruf unlinkat () auf, der der Funktion unlink()
or rmdir () entspricht, außer wenn path einen relativen Pfad angibt.
Hinweis
Auf einigen Systemen unlink
kann auch das Verzeichnis entfernt werden. Zumindest im GNU-System unlink
kann der Name eines Verzeichnisses nie gelöscht werden.