Почему я не могу сделать ls * .txt в подоболочке?

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  

Почему 2-я команда subshell не работает?

Джим
источник

Ответы:

27

Удалите цитаты вокруг, *.txtи это должно работать. С кавычками оболочка будет искать буквальное имя файла *.txt. Чтобы исследовать / экспериментировать, попробуйте создать файл с именем *.txtas touch '*.txt'и повторите команду.

MKC
источник
6
Обратите внимание, что двойные кавычки (по крайней мере, в bashаналогичных оболочках zsh) не совпадают с одинарными! Например, расширение параметра ( $foo) выполняется внутри двойных кавычек, но не одинарных.
Blacklight Shining
30

Точно так же, как вы не можете работать ls "*.txt"в обычной оболочке, вы не можете запустить и в подоболочке. Когда вы помещаете *.txtв кавычки, вы выполняете lsпоиск литерального файла, который называется, *.txtкогда вместо этого вы должны сделать это:

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

Лучший способ сделать это - вообще не использовать ls.

$ echo *.txt # => file.txt otherfile.txt
JesseG17
источник
7
+1 за удаление лишнего ls.
Blacklight Shining
3
Nitpicking: ты можешь бежать ls -l "*.txt". Или, по крайней мере, я могу. Я делаю это не часто, но когда я это делаю, мне обычно говорят, что он не может найти * .txt ...
Ingo
@lngo: Это тоже в посте ОП
Брайан,