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?

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.


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.