Ai giao dịch (phiên dịch) * trong
echo *
Liệu tiếng vang nhìn thấy ngôi sao hoặc vỏ có quan tâm đến nó và trả về một danh sách tên tệp ..
Thế còn
cp temp temp*
Ai giao dịch (phiên dịch) * trong
echo *
Liệu tiếng vang nhìn thấy ngôi sao hoặc vỏ có quan tâm đến nó và trả về một danh sách tên tệp ..
Thế còn
cp temp temp*
Câu trả lời:
bash (hoặc bất cứ thứ gì bạn sử dụng làm shell), là điều đầu tiên để đọc bất kỳ đầu vào nào và sẽ bắt đầu diễn giải các ký tự đặc biệt như ?
và *
. *
được mở rộng thành bất kỳ trận đấu nào trong CWD , điều đó có nghĩa là dấu hoa thị được thay thế bằng các trận đấu đã nói.
Trong hầu hết các trường hợp, điều này khá khó khăn về phía trước, nhưng đôi khi có thể dẫn đến một số trường hợp khó hiểu.
Hãy xem xét những điều sau đây. Một thư mục có nội dung này:
Nếu sau đó bạn gõ mv *
một cái gì đó có vẻ kỳ lạ xảy ra: test3
có, nhưng phần còn lại đã biến mất. Mặc dù kỳ lạ lúc đầu, nó có ý nghĩa một khi bạn hiểu những gì bash thực sự chuyển đến mv
. Do dấu hoa thị, bash diễn giải mv *
là mv test test1 test2 test3
và khi mv có được danh sách đó, nó sẽ cho rằng tranh luận cuối cùng là đích đến, đó là nơi mà tất cả các tệp sẽ được di chuyển.
Đối với các lệnh bạn đã liệt kê:
echo *
có chức năng như một người nghèo-mans ls
. Shell sẽ mở rộng dấu hoa thị thành bất cứ thứ gì có trong thư mục đó, và như tôi chắc chắn bạn đã biết, theo echo
nghĩa đen sẽ chỉ lặp lại bất cứ thứ gì bash truyền cho nó như là những tranh luận.cp temp temp*
sẽ hoạt động hơi giống mv
lệnh tôi đã mô tả ở trên, trừ khi chỉ có một thư mục có tên temp, trong trường hợp đó tên nguồn và tên đích là như nhau, tức là nó sẽ không làm gì cả.*
thay vì ls
. Ví dụ, for f in *; do
là nhiều hơn đáng tin cậy hơn for f in $(ls)
nếu một tên tập tin chứa khoảng trắng hoặc ký tự glob. (Tuy nhiên, nó sẽ thất bại nếu không có tệp nào trong CWD, vì vậy bạn cần phải kiểm tra trường hợp đó.)
shopt nullglob
dành cho.
echo *
, thủ thuật đó có thể giúp bạn tiết kiệm trong một số trường hợp.
Như đã nêu, shell mở rộng *
để echo
nhận dưới dạng đối số bất cứ thứ gì shell tìm thấy trong thư mục hiện tại. Tuy nhiên, lưu ý rằng nếu việc mở rộng dẫn đến không có gì, tức là trong trường hợp đó nếu thư mục không chứa các tệp không bị ẩn, thì phần *
còn lại không thay đổi và được chuyển như là lệnh được gọi (trừ khi các tùy chọn không chuẩn được sử dụng với một số shell như bash
.) echo *
sau đó sẽ không cư xử như một người nghèo vì người ls
trước sẽ không in gì trong khi người sau sẽ in *
.
Tương tự, cp /tmp/temp temp*
sẽ tạo một tệp có tên temp*
trong thư mục hiện tại nếu chưa có ít nhất một tệp có tên bắt đầu bằng temp
.
Cuối cùng, nếu bạn muốn *
thông qua không thay đổi bất kể trường hợp nào, bạn có thể bảo vệ nó khỏi sự mở rộng bằng cách sử dụng dấu ngoặc đơn '*'
, dấu ngoặc kép "*"
hoặc dấu gạch chéo ngược \*
.
Trong Bash, vỏ đối phó với nó. Bạn thấy rằng nếu bạn thậm chí thử *
mà không có tiếng vang
Lưu ý dựa trên một số nhận xét, tôi sẽ đề xuất khi chạy * ENTER, để tạo thư mục và sử dụng lệnh cảm ứng để tạo một số tệp và đảm bảo không ai trong số chúng, hoặc ít nhất là đảm bảo rằng đầu tiên theo thứ tự bảng chữ cái, không phải là tên của bất kỳ tập lệnh hoặc lệnh nào trong đường dẫn.
$ *
bash: a: command not found
$ echo *
a a.aa a.ab a.b a.htm a.tx
Vì vậy, ls *
là một chút của một cliche
Trong Windows, *
được xử lý bởi lệnh, vì vậy dir *.*
không phải là một sáo ngữ.
Lưu ý- Thấy một số bình luận, tôi sẽ thêm, có rủi ro khi chạy * sau đó ENTER. Nếu bạn có một tệp có tên rm đầu tiên trong danh sách thư mục, thì thật nguy hiểm vì mọi thứ sau đó sẽ bị xóa. Ngoài ra, và điều này ít có khả năng hơn, nếu tệp đầu tiên trong danh sách thư mục là tên của một tập lệnh trong đường dẫn, thì nó sẽ chạy nó.
rm
, tất nhiên.
-rf
gì không? Tôi đã thử touch -rf
và touch \-rf
nó không tạo ra nó.
-rf
? (Tôi hiểu sự nguy hiểm của một tập tin gọi là rm và một tập tin gọi -rf, và các vấn đề về gõ * và đẩy nhập vào trong một thư mục quan trọng, tôi không có ý định làm điều đó)
Shell thực hiện một số mở rộng trước khi các đối số được trao cho lệnh.
Xem thêm https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion
Không dành riêng cho bash, hãy xem http://pub.opengroup.org/onlinepub/9699919799/utilities/V3_chap02.html#tag_18_01