Dlaczego nie mogę wykonać ls * .txt w podpowłoce?

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  

Dlaczego nie działa polecenie drugiej podpowłoki?

Jim
źródło

Odpowiedzi:

27

Usuń cytaty *.txti powinno działać. Z cudzysłowami powłoka szuka literalnej nazwy pliku *.txt. Aby eksplorować / eksperymentować, spróbuj utworzyć plik o nazwie *.txtas touch '*.txt'i powtórz polecenie.

mkc
źródło
6
Zauważ, że podwójne cudzysłowy (przynajmniej w bashi podobne powłoki zsh) nie są takie same jak pojedyncze cudzysłowy! Na przykład interpretacja parametrów ( $foo) jest wykonywana w cudzysłowach, ale nie w pojedynczych cudzysłowach.
Blacklight Shining
30

W ten sam sposób, w jaki nie można uruchomić ls "*.txt"w normalnej powłoce, nie można również uruchomić go w podpowłoce. Kiedy wpisujesz *.txtcudzysłowy, lsszukałeś dosłownego pliku o nazwie, *.txtkiedy zamiast tego powinieneś to zrobić:

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

Lepszym sposobem na to jest wcale ls.

$ echo *.txt # => file.txt otherfile.txt
JesseG17
źródło
7
+1 za usunięcie zbędnego ls.
Blacklight Shining
3
Nitpicking: Użytkownik może uruchomić ls -l "*.txt". A przynajmniej mogę. Robię to nie często, ale kiedy to robię, zwykle mówi mi, że nie można znaleźć * .txt ...
Ingo
@lngo: To też jest post PO
Brian