¿Por qué no puedo hacer ls * .txt en 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  

¿Por qué falla el segundo comando subshell?

Jim
fuente

Respuestas:

27

Elimine las comillas *.txty debería funcionar. Con comillas, shell buscará el nombre de archivo literal *.txt. Para explorar / experimentar, intente crear un archivo con nombre *.txtcomo touch '*.txt'y repita el comando.

mkc
fuente
66
Tenga en cuenta que las comillas dobles (al menos en mayúsculas bashy similares zsh) no son lo mismo que las comillas simples. Por ejemplo, la expansión del parámetro ( $foo) se realiza entre comillas dobles, pero no entre comillas simples.
Blacklight Shining
30

De la misma manera que no puede ejecutarse ls "*.txt"en un shell normal, tampoco puede ejecutarlo en un subshell. Cuando pones *.txtcomillas, hiciste una lsbúsqueda de un archivo literal llamado *.txtcuándo deberías estar haciendo esto:

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

Una mejor manera de hacer esto es no usarlo lsen absoluto.

$ echo *.txt # => file.txt otherfile.txt
JesseG17
fuente
77
+1 para eliminar el redundante ls.
Blacklight Shining
3
Nitpicking: puedes correr ls -l "*.txt". O al menos yo puedo. No lo hago a menudo, pero cuando lo hago, generalmente me dice que no pudo encontrar * .txt ...
Ingo
@lngo: Eso también está en la publicación del OP
Brian