Pourquoi ne puis-je pas faire ls * .txt dans un sous-shell?

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  

Pourquoi la 2e commande subshell échoue?

Jim
la source

Réponses:

27

Supprimez les guillemets *.txtet cela devrait fonctionner. Avec des guillemets, le shell recherchera le nom de fichier littéral *.txt. Pour explorer / expérimenter, essayez de créer un fichier avec le nom *.txtas touch '*.txt'et répétez la commande.

mkc
la source
6
Notez que les guillemets doubles (au moins dans bashet les shells similaires comme zsh) ne sont pas les mêmes que les guillemets simples! Par exemple, l'expansion des paramètres ( $foo) se fait entre guillemets doubles, mais pas entre guillemets simples.
Blacklight Shining
30

De la même manière que vous ne pouvez pas l'exécuter ls "*.txt"dans un shell normal, vous ne pouvez pas non plus l'exécuter dans un sous-shell. Lorsque vous mettez des *.txtguillemets, vous faites une lsrecherche pour un fichier littéral appelé *.txtquand vous devriez plutôt faire ceci:

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

Une meilleure façon de procéder consiste à ne pas utiliser lsdu tout.

$ echo *.txt # => file.txt otherfile.txt
JesseG17
la source
7
+1 pour supprimer le redondant ls.
Blacklight Shining
3
Nitpicking: vous pouvez courir ls -l "*.txt". Ou du moins je peux. Je ne le fais pas souvent, mais quand je le fais, il me dit généralement qu'il n'a pas pu trouver * .txt ...
Ingo
@lngo: C'est aussi dans le poste du PO
Brian