Gibt es, wie aus dem Titel hervorgeht, einen Unterschied für * NIX-Dateisysteme? zB ls fileundls ./file
Gibt es, wie aus dem Titel hervorgeht, einen Unterschied für * NIX-Dateisysteme? zB ls fileundls ./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 \-dingleoder 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 rmeinen 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 $filestattdessen 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 ./$ihilft nichts.
rm: invalid option -- ' ', wenn versucht wird, das Leerzeichen danach -rfals 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 awkein Operand (außer einem ersten Operanden, bei dem es sich um das Skript handelt) mit einer Form foo=barals auszuführende Zuweisung, aber ./foo=barals zu lesende Datei behandelt wird.
Ja.
Durch die Ausgabe filein 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.imgbeim Aufrufen ./isles.imgwä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 lswird 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 fileund dem expliziten Angeben feststellen, ./fileda 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
lsin 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
lses 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.