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.