Tại sao tôi không thể làm ls * .txt trong một mạng con?


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  

Tại sao lệnh subshell thứ 2 không thành công?

Câu trả lời:


27

Xóa các trích dẫn xung quanh *.txtvà nó sẽ hoạt động. Với dấu ngoặc kép sẽ tìm tên tệp theo nghĩa đen *.txt. Để khám phá / thử nghiệm, hãy thử tạo một tệp có tên *.txttouch '*.txt'và lặp lại lệnh.


6
Lưu ý rằng dấu ngoặc kép (ít nhất là trong bashvà các vỏ tương tự như zsh) không giống với dấu ngoặc đơn! Ví dụ, mở rộng tham số ( $foo) được thực hiện bên trong dấu ngoặc kép, nhưng không phải dấu ngoặc đơn.
Blacklight Shining

30

Theo cùng một cách mà bạn không thể chạy ls "*.txt"trong một vỏ bình thường, bạn cũng không thể chạy nó trong một lớp con. Khi bạn đặt *.txtdấu ngoặc kép, bạn đã thực hiện lstìm kiếm một tệp bằng chữ được gọi *.txtkhi thay vào đó bạn nên thực hiện việc này:

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

Một cách tốt hơn để làm điều này là không sử dụng lstất cả.

$ echo *.txt # => file.txt otherfile.txt

7
+1 để loại bỏ dự phòng ls.
Blacklight Shining

3
Nitpicking: Bạn có thể chạy ls -l "*.txt". Hoặc ít nhất là tôi có thể. Tôi làm điều đó không thường xuyên, nhưng khi tôi làm, nó thường nói với tôi rằng nó không thể tìm thấy * .txt ...
Ingo

@lngo: Đó cũng là bài đăng của OP
Brian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.