Der Ausdruck .*
wird durch Bash erweitert, um das aktuelle und das übergeordnete Verzeichnis einzuschließen:
$ ls -la
total 2600
drwxrwxrwx 2 terdon terdon 2162688 Sep 10 16:22 .
drwxr-xr-x 142 terdon terdon 491520 Sep 10 15:34 ..
-rw-r--r-- 1 terdon terdon 0 Sep 10 16:22 foo
$ echo .*
. ..
Wenn ich rm -rf .*
auf meinem Debian mit GNU-Bash version 4.2.36(1)-release
und rm
von laufe rm (GNU coreutils) 8.13
, erhalte ich folgende Meldung:
$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'
Ist das eine GNU-Sache oder ist es POSIX? Gibt es * nix-Systeme, auf denen der obige Befehl unbemerkt löscht .
und ..
?
Ist dies auch ein Sicherheitsmerkmal der Shell oder des rm
Befehls selbst?
rm
, aber ich dachte , es wert war , zu erwähnen , dass Sie immer noch zu unerwarteten Ergebnissen mit haben kannchmod
,chown
usw. , wenn passend.*
.Antworten:
Die neueste (Stand 2017) Version der POSIX-Spezifikation für das
rm
Dienstprogramm ist hier (und die vorherige dort ) und verbietet das Löschen von.
und..
.Wie von @jlliagre angemerkt, handelt es sich bei dem Teil about
/
um eine Ergänzung in SUSv4.Die älteste öffentlich verfügbare Unix-Spezifikation, die ich finden konnte ( XPF4 CAE rev2 (1994)), hat dies bereits spezifiziert
.
und..
kann nicht entfernt werden, obwohl Kommentare im Änderungsprotokoll von GNU fileutils darauf hindeuten, dass dies bereits in älteren POSIX-Spezifikationen der Fall war.Beachten Sie, dass dies auch für
dir/..
und gilt../
, aber einige Implementierungen (einschließlich UNIX-zertifizierter Implementierungen wie Solaris 11 und macOS) weiterhin nicht vorrm -rf ../
oder schützenrm -rf .*/
.Geschichte
Frühe Unikate
Die
-r
Option zurm
wurde in Unix V3 (1973) hinzugefügt, obwohl nur der Inhalt der Verzeichnisse gelöscht wurde. Sie müssten sie dennochrmdir
zum Entfernen von Verzeichnissen verwenden.Dies änderte sich in Unix V7 (1979, der Veröffentlichung, die auch die Bourne-Shell einführte und von der die meisten Unices abstammen).
rm -r
jetzt entfernte auch Verzeichnisse und würde den..
Verzeichnisbaum nicht löschen . In der Manpage heißt es:(obwohl man argumentieren könnte, dass
rm -r .*
es immer noch unsozial ist, da es alles löscht, weil.
es enthalten ist).Das Entfernen wurde dennoch akzeptiert,
.
ohne dass die Verknüpfung zu den Einträgen.
oder..
aufgehoben wurde. Esrm -r .
war also eine effektive Möglichkeit, das aktuelle Verzeichnis zu leeren.Beachten Sie auch, dass die Schutzmaßnahme nur für ein wörtliches
..
Argument und nicht fürdir/..
oder gedacht war./..
. Also,rm -rf ./.*
würde immer noch alles in dem übergeordneten Verzeichnis entfernen rekursiv.Es ist interessant zu sehen , dass das war schon die Wanze / misfeature zu umgehen , mit denen Klackse umfassen könnten
.
und..
bei ihrer Expansion. Das wurde in der Forsyth-Shell (die Basis für die ursprüngliche Minix-Shell und pdksh) in den späten 80ernzsh
(1990) undfish
(2005) behoben, aber nicht in anderen Shells und insbesondere nicht in der POSIX-sh
Sprache, deren Erweiterung es erfordert.*
,.
und..
wenn Sie werden von zurückgegebenreaddir()
( behebtbash
das Problem teilweise nur,shopt -s dotglob
wenn Globs (mit Ausnahme.xxx
derjenigen) nicht enthalten sind,.
oder..
und wenn Sie dies tunksh
, können Sie es behebenFIGNORE='@(.|..)'
).Wann genau auch das Verbieten
.
hinzugefügt wurde, ist nicht immer klar und variiert mit jedem Unix. Ein paar Erkenntnisse weiter unten.BSDs
Das Verbot von
.
wurde irgendwann zwischen 2.9BSD (1983) und 2.10BSD (1987) sowie zwischen 4.2BSD (1983) und 4.3BSD (1986) hinzugefügt (siehe diese Änderung mit dem Zeitstempel 1985 im Unix-History-Repo ).Für
dir/.
unddir/..
siehe diese Änderung im Jahr 1988 (BSD 4.3 Net / 1).Bis
rm
heute leert die von FreeBSD (und Derivaten wie macOS) immer noch das aktuelle oder übergeordnete Verzeichnis aufrm -rf ./
oderrm -rf ../
obwohl (wichtig fürrm -rf .*/
).System V
Ich habe nicht viele Informationen, da weder Quelle noch Binärdatei für die AT & T-Unix-Derivate nach V7 öffentlich verfügbar sind. In seinem Online-Handbuch erwähnt HPUX (basierend auf System III) immer noch, dass es nur verbietet,
..
während es effektiv beides verbietet. Dies ist ein Hinweis darauf, dass zumindest SysIII das Löschen von.
( edit : Betrachtet man nun den SysIII-rm
Quellcode , so ist es praktisch unverändert seit Unix V7).Alle anderen Online-Handbücher, die ich überprüft habe, erwähnen das Löschen
.
oder..
sind verboten, was zu erwarten ist, dass sie POSIX-konform sind.Solaris
rm
leert weiterhin das aktuelle oder übergeordnete Verzeichnis aufrm -rf ./
oderrm -rf ../
.GNU
Das frühe Änderungsprotokoll für die GNU-Dateien enthält alle historischen Informationen.
Während ursprünglich weder Löschen
.
noch..
Verboten war,..
war erst und dann beides (einschließlichdir/.
) verboten , alles zwischen 1990 und 1991.andere
Wie wir gesehen haben
zsh
, beinhaltet die Erweiterung von.*
(oder einem beliebigen Glob) niemals.
oder..
(sogar imsh
Emulationsmodus). Dasrm
eingebaute (was Sie bekommen, wenn Siezmodload zsh/files
) behandelt daher nicht.
oder..
speziell. Also, mit diesemzsh
builtin, Sie könnenrm -rf .
oderrm -rf ..
zu leeren.
oder..
aberrm -rf .*
nicht entfernen.
oder..
.In busybox
rm
wurde das Verbot des Löschens von.
und..
in 0.52 (2001) hinzugefügtquelle
rm -rf . /
(beachte das Leerzeichen) zwei Warnungen (für.
und/
) ausgegeben und beendet werden sollen, aber wir scheinen alle paar Monate eine Frage zu bekommen, wie man sich davon erholt.