Gibt es, wie aus dem Titel hervorgeht, einen Unterschied für * NIX-Dateisysteme? zB ls file
undls ./file
linux
filesystems
Sergey Alaev
quelle
quelle
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:
Schlimmer noch, was ist, wenn die Datei den Namen "
-rf rmbomb *
" trägt? Versuchen Sie nun, es zu entfernenIch 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.Das Gleiche gilt für
rm
quelle
ls \-dingle
oderls \-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 nurrm
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 Sierm $file
stattdessen ausführenrm "$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 eineval
.) 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 Namenspace -rf .
oder so machen, dasrm ./$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, dassawk
ein Operand (außer einem ersten Operanden, bei dem es sich um das Skript handelt) mit einer Formfoo=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 istls
, werden Sie keinen Unterschied zwischen dem Angebenfile
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
quelle
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.