~$ 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?
Supprimez les guillemets *.txt
et 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 *.txt
as touch '*.txt'
et répétez la commande.
bash
et les shells similaires commezsh
) 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.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*.txt
guillemets, vous faites unels
recherche pour un fichier littéral appelé*.txt
quand vous devriez plutôt faire ceci:Une meilleure façon de procéder consiste à ne pas utiliser
ls
du tout.la source
ls
.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 ...