Mengapa saya tidak bisa melakukan ls * .txt dalam subkulit?

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  

Mengapa perintah subkulit ke-2 gagal?

Jim
sumber

Jawaban:

27

Hapus tanda kutip di sekitar *.txtdan itu harus bekerja. Dengan tanda kutip shell akan mencari nama file literal *.txt. Untuk menjelajahi / eksperimen, mencoba membuat file dengan nama *.txtsebagai touch '*.txt'dan ulangi perintah.

mkc
sumber
6
Perhatikan bahwa tanda kutip ganda (setidaknya dalam bashdan sejenisnya mirip zsh) tidak sama dengan tanda kutip tunggal! Misalnya, ekspansi parameter ( $foo) dilakukan di dalam tanda kutip ganda, tetapi bukan tanda kutip tunggal.
Blacklight Shining
30

Dengan cara yang sama Anda tidak dapat menjalankan ls "*.txt"shell yang normal, Anda juga tidak bisa menjalankannya dalam subshell. Ketika Anda memberi *.txttanda kutip, Anda lsmencari file literal yang disebut *.txtkapan Anda seharusnya melakukan ini:

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

Cara yang lebih baik untuk melakukan ini adalah tidak menggunakan lssama sekali.

$ echo *.txt # => file.txt otherfile.txt
JesseG17
sumber
7
+1 untuk menghapus yang mubazir ls.
Blacklight Shining
3
Nitpicking: Anda bisa berlari ls -l "*.txt". Atau setidaknya saya bisa. Saya tidak sering melakukannya, tetapi ketika saya melakukannya, biasanya memberitahu saya bahwa itu tidak dapat menemukan * .txt ...
Ingo
@ lngo: Itu juga ada di pos OP
Brian