Frage Gibt es einen Unterschied zwischen "Datei" und "./file" Pfaden?


Wie der Titel sagt, gibt es einen Unterschied für * NIX-Dateisysteme? z.B ls file und ls ./file


12
2017-10-21 19:55


Ursprung


Sie könnten fragen unix.stackexchange.com - Die Antworten haben alle gute Informationen in ihnen, aber keiner fühlt sich wirklich so an das Antworten. - Rob Starling


Antworten:


Ich bin nicht verrückt nach der Erklärung von SmallLoanOf1M. Es ist technisch korrekt, antwortet aber auf eine Art, die nicht mit dem Anwendungsbeispiel in der Frage übereinstimmt.

Also hier ist zum Beispiel ein wichtiger Unterschied zwischen den beiden aus der Frage: "Datei" und "./file"

Was ist, wenn die Datei mit einem Zeichen benannt wird, das von der Shell analysiert wird? Insbesondere in Bezug auf Zeichen, die durch den Befehl interpretiert werden, der gerade ausgeführt wird.

Insbesondere das "Strich" -Zeichen: "-". Aber andere Zeichen sind für die Shell sinnvoll.

Beispiel. Meine Datei wurde "-dingle" genannt

Versuchen Sie, die Datei aufzulisten:

ls -dingle
# ls -dingle
ls: invalid option -- 'e'

Was noch schlimmer ist, wenn die Datei benannt wurde "-rf rmbomb *"? Jetzt versuche es zu entfernen

rm "-rf rmbomb *"

Ich werde nicht einmal versuchen, dieses Beispiel zu führen, aber hoffentlich kommst du auf die Idee.

Wie listen Sie also eine Datei auf, die mit Strich beginnt? Benutzen ./ vor.

# ls ./-dingle
./-dingle

Dito für rm


14
2017-10-21 20:51



Das ist eine gültige Möglichkeit, einige Dateien mit ungeraden Namen zu verarbeiten, und in meiner Antwort wurden solche Dateien nicht berücksichtigt. Man könnte in allen obigen Beispielen auch ein Literal in Form eines umgekehrten Schrägstrichs vor ungeraden Zeichen einschließlich der oben angegebenen Leerzeichen verwenden. Ein Beispiel dafür wäre: ls \-dingle oder ls \-rf\ rmbomb\ \*. Dies kann ein guter Weg sein, um sicherzustellen, dass jede gegebene Menge von Befehlen zumindest konsistent ist, wie spezifiziert ./ vor einem Namen nicht Zeichen nach dem ./. - Spooler
Es passiert, dass, da Escapes von der Shell, nicht vom Befehl und params von dem Befehl geparsed werden, das Escapen oder Zitieren der - tut nichts nützliches. - Dewi Morgan
Du machst es wie klingen rm "-rf rmbomb *" würde eigentlich etwas Schlechtes tun, anstatt nur zu machen rm einen Fehler ausgeben. Es ist nur gefährlich, wenn Sie vergessen, den Dateinamen zu zitieren, damit Wortteilung geschieht. (vor allem in einem Shell-Skript, in dem Sie laufen rm $file anstatt rm "$file". Aber in diesem Fall, der * wird nicht expandieren, weil die Glob-Expansion nicht auf den Inhalt der Variablenerweiterung erfolgt. Wenn du das willst, brauchst du einen eval.) Wie auch immer, wenn Ihr Skript Word-Dateinamen vor der Übergabe an rm teilt, würde ich eine Datei namens space -rf . oder so etwas rm ./$i hilft nicht. - Peter Cordes
BTW, die eigentliche Fehlermeldung ist rm: invalid option -- ' ', von wann es versucht, den Raum danach zu interpretieren -rf als ein Ein-Zeichen-Schalter, weil es Teil des gleichen Arguments ist. (Und ja, ich habe das in einem leeren Verzeichnis ausgeführt, nur für den Fall, dass ich etwas übersehen hätte und es tatsächlich gefährlich war: P) - Peter Cordes
@PeterCordes: wordsplitting und globbing DOES auftreten auf die Ergebnisse der nicht quoted Variablenerweiterung und Befehlsersetzung, sofern nicht durch unterdrückt IFS='' und -f beziehungsweise. Ein selteneres Beispiel ist das awk behandelt einen Operanden (anders als ein erster Operand, der das Skript ist) mit Form foo=bar als eine Aufgabe auszuführen aber ./foo=bar als eine Datei zum Lesen. - dave_thompson_085


Ja.

Durch die Ausgabe file In der Befehlszeile sucht BASH in Ihrer $ PATH-Umgebungsvariablen 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. ./ meint innerhalb das aktuelle Verzeichnis relativ. Es ist gleichbedeutend mit etwas wie sagen /home/sheogorath/shivering/isles.img beim Aufruf ./isles.img während der Arbeit in der /home/sheogorath/shivering/ Verzeichnis.

Als solches wird es häufig verwendet, um Dateien in Ihrem Arbeitsverzeichnis "in Place" auszuführen.

BEARBEITEN: In Ihrem Beispiel ls wird von der Shell aufgerufen und über die Pfadvariable gefunden. Sein Argument wird in Ihrem Arbeitsverzeichnis verarbeitet, was auch immer das sein mag. Da dies der Standard für ist ls, Sie werden keinen Unterschied zwischen der Angabe sehen file und explizit angeben ./file Beide zeigen auf Ihr aktuelles Verzeichnis.

Nicht alle Befehle akzeptieren Dateipfade im Arbeitsverzeichnis und manche erwarten, dass Sie Dateien in einem Verzeichnis angeben, das sie selbst über die Konfiguration vordefinieren. Unter den Befehlen, die Dateien als Argumente akzeptieren, sind diese Befehle weniger üblich


7
2017-10-21 20:02



Das ist Bash, aber ich habe mich generell über die Pfadauflösung Gedanken gemacht - Sergey Alaev
So funktioniert jede Shell, von der ich je gehört habe. BASH ist nur das am häufigsten verwendete. - Spooler
$ PATH ist nur für Befehle relevant und hat nichts mit Dateinamen, die einem Befehl wie ls in der ursprünglichen Frage erwähnt. Das ist mehr der Unterschied zwischen dem Referencing a relativer Pfad (relativ zu dem aktuellen Arbeitsverzeichnis) I.e. ../../dir/filename und ein absoluter Pfad  /path/to/dir/filename - HBruijn
+1 für Sheogorath ... und eine richtige Antwort. - Corey Ogburn
Wenn es sich um Argumente für einen Befehl handelt, der standardmäßig versucht, Dateien im Arbeitsverzeichnis zu finden, sind sie identisch. So für ls Sie werden immer derselbe Pfad sein, einer genauer spezifiziert als der andere. Nicht alle Befehle verhalten sich bei der Verarbeitung von Argumenten so, die meisten jedoch. - Spooler