Por que não consigo fazer ls * .txt em um 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 que o comando do 2º subshell falha?

Jim
fonte

Respostas:

27

Remova as aspas *.txte deve funcionar. Com aspas, o shell procurará o nome do arquivo literal *.txt. Para explorar / experimentar, tente criar um arquivo com o nome *.txtcomo touch '*.txt'e repita o comando.

mkc
fonte
6
Observe que aspas duplas (pelo menos em bashconchas semelhantes e semelhantes zsh) não são iguais a aspas simples! Por exemplo, a expansão do parâmetro ( $foo) é feita entre aspas duplas, mas não aspas simples.
Blacklight Shining
30

Da mesma forma que você não pode executar ls "*.txt"em um shell normal, também não pode executá-lo em um subshell. Ao colocar *.txtaspas, você lspesquisou um arquivo literal chamado *.txtquando deveria fazer o seguinte:

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

A melhor maneira de fazer isso é não usar lsnada.

$ echo *.txt # => file.txt otherfile.txt
JesseG17
fonte
7
+1 para remover o redundante ls.
Blacklight Shining
3
Nitpicking: você pode executar ls -l "*.txt". Ou pelo menos eu posso. Eu faço isso muitas vezes não, mas quando eu faço, ele geralmente diz-me que não poderia encontrar .txt * ...
Ingo
@lngo: Isso também está no post do OP
Brian