Perché non posso fare ls * .txt in una subshell?


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  

Perché il secondo comando subshell fallisce?

Risposte:


27

Rimuovi le virgolette *.txte dovrebbe funzionare. Con virgolette shell cercherà il nome del file letterale *.txt. Per esplorare / sperimentare, prova a creare un file con nome *.txtas touch '*.txt'e ripeti il ​​comando.


6
Nota che le virgolette doppie (almeno in bashe simili shell zsh) non sono le stesse delle virgolette singole! Ad esempio, l'espansione dei parametri ( $foo) viene eseguita tra virgolette doppie, ma non tra virgolette singole.
Blacklight Shining

30

Allo stesso modo in cui non è possibile eseguire ls "*.txt"in una shell normale, non è possibile eseguirlo nemmeno in una subshell. Quando inserisci le *.txtvirgolette, hai fatto la lsricerca di un file letterale chiamato *.txtquando invece dovresti fare questo:

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

Un modo migliore per farlo è di non utilizzare lsaffatto.

$ echo *.txt # => file.txt otherfile.txt

7
+1 per la rimozione del ridondante ls.
Blacklight Shining

3
Nitpicking: puoi correre ls -l "*.txt". O almeno posso. Lo faccio non spesso, ma quando lo faccio, di solito mi dice che non è stato possibile trovare * .txt ...
Ingo,

@lngo: anche questo è nel post del PO
Brian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.