it-swarm.com.de

Warum würde der Befehl "ls *" einen Fehler über ungültige Optionen erzeugen?

Es gibt einen Thread, der davon spricht, dass ls "*" Keine Dateien anzeigt, aber ich frage mich eigentlich, warum das einfach ist

ls *

der Befehl gibt in meinem Terminal nichts anderes aus als

ls: invalid option -- '|'
Try 'ls --help' for more information.

während

ls

listet alle Dateien in den aktuellen Verzeichnissen als auf

 1                  ferol                      readme.txt
 2                  fichier                    sarku
 2018               GameShell                  Templates
 22223333          '-|h4k3r|-'                 test
 3                  hs_err_pid2301.log         test2
 CA.txt             important.top.secret.txt   toto.text
 CA.Zip             JavaBlueJProject           tp1_inf1070
 countryInfo.txt    liendur                   'tp1_inf1070_A19(2) (1)'
 currency           liensymbolique             tp1_inf1070_A19.tar
 curreny            LOL                        Videos
 Desktop            Longueuil                 'VirtualBox VMs'
 Documents          Music                      words
 douffos            numbers                    Zip.zip
 Downloads          Pictures
 examples.desktop   Public

Irgendwelche Ideen, warum das Globbing hier nicht wirksam wird? Ich bin auf Ubuntu und arbeite im Terminal. Ich weiß nicht, ob es einen Unterschied macht.

Vielen Dank.

34
MaelPJ

Wenn du rennst

ls *

das Globbing wird wie gewohnt wirksam und der * wird auf alle Dateinamen im aktuellen Verzeichnis erweitert - einschließlich dieses:

-|h4k3r|-

Das beginnt mit einem -, Also versucht ls, es als Option zu analysieren (wie -a Oder -l). Da | Eigentlich keine von ls erkannte Option ist, beschwert es sich mit der Fehlermeldung invalid option Und wird dann beendet (ohne Dateien aufzulisten).

Wenn Sie alles im aktuellen Ordner explizit auflisten möchten, versuchen Sie es stattdessen

ls ./*

... die allen Dateinamen ./ voranstellen (damit der Eintrag nicht als Option falsch interpretiert wird), oder

ls -- *

... wobei -- das "Trennzeichen für das Ende der Optionen" ist, d. h. Alle verbleibenden Argumente sind Dateinamen.

101
JigglyNaga

Ich denke, der wichtige fehlende konzeptionelle Sprung hier ist, wo das Globbing gemacht wird. ls macht niemals selbst Globbing. Wenn Sie keine Argumente angeben, wird davon ausgegangen, dass Sie . Bedeuteten, und dieses Verzeichnis wird wie jedes Verzeichnis aufgelistet, das Sie in der Befehlszeile angegeben haben.

Das, was das Globbing macht, ist die Shell. Die Shell übergibt die Ergebnisse dann als eine Reihe von Befehlszeilenargumenten an ls. ls hat keine Ahnung, ob Sie diese Argumente eingegeben haben oder ob sie das Ergebnis einer Glob-Erweiterung sind. Und so analysiert es sie nach Flags wie alle anderen Befehlszeilenargumente.

So funktioniert es nicht unter Windows, was meiner Meinung nach ein großer Fehler im Umgang von Windows mit Befehlszeilenprogrammen ist.

Eine weitere interessante Demonstration besteht darin, ein Verzeichnis zu erstellen, das eine Reihe von Verzeichnissen enthält. Wenn Sie dann dort ls * Ausführen, gibt die Shell alle diese Verzeichnisse als Argumente an, und ls gibt Ihnen eine Auflistung für jedes dieser Verzeichnisse. Dies zeigt nur, dass die Annahme von ., Wenn Sie kein Argument angegeben haben, eine einfache Standardeinstellung ist und kein spezielles Verhalten.

Wenn Sie ./* Anstelle von * Sagen, führt die Shell eine Glob-Erweiterung durch, die dazu führt, dass alles ./ Vor sich hat, also wird ls dies nicht tun Interpretieren Sie eines der Argumente als Optionen. Wenn Sie ls -- * Ausführen, interpretiert ls die Option -- Als bedeutet, dass der Versuch, Optionen zu verarbeiten, eingestellt und alle übrigen Argumente als Dateien oder Verzeichnisse behandelt werden sollen, die a geben sollen Auflistung für. Also, IMHO, -- Ist die bessere Wahl.

Die -- - Konvention wird von der überwiegenden Mehrheit der Unix-Befehlszeilendienstprogramme befolgt und ist eine Standardfunktion der meisten Argumentanalyse-Bibliotheken, die für die meisten Sprachen geschrieben wurden.

4
Omnifarious

Im Allgemeinen sollte der Befehl ls * Alle Dateien und Verzeichnisse in Ihrem aktuellen Arbeitsverzeichnis auflisten. Es gibt zwei Fälle, die zu dem Problem führen würden, mit dem Sie konfrontiert sind.

  1. Wenn eine der im Verzeichnis enthaltenen Dateien nicht unterstützte Zeichen enthält, z. B. ein Verzeichnis mit dem Namen --2 “Oder -2, Würde dies zu einem solchen Fehler führen. Zum Beispiel:

    # ls -la | grep 2$
    drwxrwxr-x  2 test test    4096 Oct 28 14:58 --2
    # ls *
    ls: unrecognized option '--2'
    

    Dies liegt daran, dass der Dateiname, der mit - Beginnt, als Option für den Befehl ls betrachtet wird.

  2. Wenn dies nicht der Fall ist, ist möglicherweise in Ihrer .bashrc - Datei ein Alias ​​festgelegt. Wenn ich beispielsweise den Alias ​​alias ls='ls –2' Setze, kann ich den Befehl ls nicht verwenden, da eine ungültige Option aufgerufen wird, nämlich -2.

0
Not Named