Gibt es, wie aus dem Titel hervorgeht, einen Unterschied für * NIX-Dateisysteme? zB ls file
undls ./file
Gibt es, wie aus dem Titel hervorgeht, einen Unterschied für * NIX-Dateisysteme? zB ls file
undls ./file
Antworten:
Ich bin nicht verrückt nach der Erklärung von SmallLoanOf1M. Es ist technisch korrekt, aber die Antworten stimmen nicht mit dem Verwendungsbeispiel in der Frage überein.
Als Beispiel ist hier ein wichtiger Unterschied zwischen den beiden von der Frage: "Datei" und "./Datei"
Was ist, wenn die Datei mit einem Zeichen benannt ist, das von der Shell analysiert wird? Insbesondere in Bezug auf Zeichen, die vom Befehl interpretiert werden, wird ausgeführt.
Insbesondere das "Bindestrich" -Zeichen: "-". Aber andere Zeichen sind für die Shell von Bedeutung.
Beispiel. Meine Datei hieß "-dingle"
Versuchen Sie, die Datei aufzulisten:
ls -dingle
# ls -dingle
ls: invalid option -- 'e'
Schlimmer noch, was ist, wenn die Datei den Namen " -rf rmbomb *
" trägt? Versuchen Sie nun, es zu entfernen
rm "-rf rmbomb *"
Ich werde nicht einmal versuchen, dieses Beispiel auszuführen, aber ich hoffe, Sie haben die Idee.
Wie listet man eine Datei auf, die mit einem Bindestrich versehen ist? Verwenden Sie ./
vor.
# ls ./-dingle
./-dingle
Das Gleiche gilt für rm
ls \-dingle
oder ls \-rf\ rmbomb\ \*
. Dies kann eine gute Möglichkeit sein, um sicherzustellen, dass alle angegebenen Befehlssätze mindestens konsistent sind, da die Angabe ./
vor einem Namen nach dem Zeichen kein Escapezeichen darstellt ./
.
rm "-rf rmbomb *"
würde es tatsächlich etwas Schlechtes tun, anstatt nur rm
einen Fehler beim Drucken zu verursachen. Es ist nur gefährlich, wenn Sie vergessen, den Dateinamen in Anführungszeichen zu setzen. (Insbesondere in einem Shell-Skript, in dem Sie rm $file
stattdessen ausführen rm "$file"
. In diesem Fall wird das Skript *
jedoch nicht erweitert, da bei den Inhalten der Variablenerweiterung keine Glob-Erweiterung stattfindet. Wenn Sie dies möchten, benötigen Sie ein eval
.) Wie auch immer, wenn Ihr Skript die Dateinamen mit einem Wort aufteilt, bevor sie an rm übergeben werden, würde ich eine Datei mit dem Namen space -rf .
oder so machen, das rm ./$i
hilft nichts.
rm: invalid option -- ' '
, wenn versucht wird, das Leerzeichen danach -rf
als ein Zeichen zu interpretieren , da es Teil desselben Arguments ist. (Und ja, ich habe dies in einem leeren Verzeichnis ausgeführt, nur für den Fall, dass ich etwas übersehen hatte und es tatsächlich gefährlich war: P)
IFS=''
und unterdrückt werden -f
. Ein selteneres Beispiel ist, dass awk
ein Operand (außer einem ersten Operanden, bei dem es sich um das Skript handelt) mit einer Form foo=bar
als auszuführende Zuweisung, aber ./foo=bar
als zu lesende Datei behandelt wird.
Ja.
Durch die Ausgabe file
in der Befehlszeile durchsucht BASH Ihre Umgebungsvariable $ PATH nach einer Datei mit diesem Namen. Sofern sich die Datei nicht in einem Verzeichnis innerhalb Ihrer $ PATH-Variablen befindet, wird sie nicht gefunden.
.
bedeutet das aktuelle Verzeichnis. ./
bedeutet innerhalb des aktuellen Verzeichnisses, in relativen Begriffen. Es ist das Äquivalent dazu, etwas zu sagen, wie /home/sheogorath/shivering/isles.img
beim Aufrufen ./isles.img
während der Arbeit im /home/sheogorath/shivering/
Verzeichnis.
Daher wird es häufig verwendet, um Dateien in Ihrem Arbeitsverzeichnis "an Ort und Stelle" auszuführen.
EDIT:
In Ihrem Beispiel ls
wird von der Shell aufgerufen und mithilfe der Pfadvariablen gefunden. Das Argument wird in Ihrem Arbeitsverzeichnis verarbeitet, wie auch immer das sein mag. Da dies die Standardeinstellung für ist ls
, werden Sie keinen Unterschied zwischen dem Angeben file
und dem expliziten Angeben feststellen, ./file
da beide auf Ihr aktuelles Verzeichnis verweisen.
Nicht alle Befehle akzeptieren Dateipfade im Arbeitsverzeichnis, und einige erwarten, dass Sie Dateien in einem Verzeichnis angeben, das sie selbst über die Konfiguration vordefinieren. Unter Befehlen, die Dateien als Argumente akzeptieren, sind diese Befehle weniger verbreitet
ls
in der ursprünglichen Frage erwähnt wurde. Das ist eher der Unterschied zwischen dem Verweisen auf einen relativen Pfad (relativ zum aktuellen Arbeitsverzeichnis), d. ../../dir/filename
/path/to/dir/filename
ls
es immer derselbe Pfad, von dem einer expliziter als der andere angegeben wird. Nicht alle Befehle verhalten sich bei der Verarbeitung von Argumenten so, die meisten jedoch.