Warum kann ich ls * .txt nicht in einer Subshell ausführen?

13
~$ echo $(ls)  
arguments.txt cecho.sh Desktop Documents Downloads example.txt Music Pictures Public     
~$ echo $(ls "*.txt")  
ls: cannot access *.txt: No such file or directory  

Warum schlägt der 2. Subshell-Befehl fehl?

Jim
quelle

Antworten:

27

Entfernen Sie die Anführungszeichen herum *.txtund es sollte funktionieren. Bei Anführungszeichen sucht die Shell nach dem wörtlichen Dateinamen *.txt. Um zu erforschen / Experiment versuchen , eine Datei mit dem Namen zu schaffen , *.txtwie touch '*.txt'und wiederholen Sie den Befehl.

mkc
quelle
6
Beachten Sie, dass doppelte Anführungszeichen (zumindest in bashund ähnliche Shells wie zsh) nicht mit einfachen Anführungszeichen identisch sind! Beispielsweise erfolgt die Parametererweiterung ( $foo) in doppelten Anführungszeichen, jedoch nicht in einfachen Anführungszeichen.
Blacklight Shining
30

So wie Sie ls "*.txt"eine normale Shell nicht ausführen können, können Sie sie auch nicht in einer Subshell ausführen. Bei der Eingabe *.txtvon Anführungszeichen haben Sie lsnach einer Literaldatei gesucht, die aufgerufen wurde, *.txtwenn Sie dies stattdessen tun sollten:

$ echo $(ls *.txt) # => file.txt otherfile.txt

Ein besserer Weg, dies zu tun, ist es, überhaupt nicht zu verwenden ls.

$ echo *.txt # => file.txt otherfile.txt
JesseG17
quelle
7
+1 zum Entfernen der redundanten ls.
Blacklight Shining
3
Nitpicking: Du kannst rennen ls -l "*.txt". Zumindest kann ich das. Ich mache es nicht oft, aber wenn ich es tue, sagt es mir normalerweise, dass es * .txt nicht finden konnte ...
Ingo
@lngo: Das steht auch im OP
Brian