Chức năng của dấu hoa thị như một lệnh độc lập trong Unix là gì?


21

Tôi đã loay hoay trong thiết bị đầu cuối trên Red Hat Linux và khi tôi gõ dấu hoa thị ( *) theo sau là trả về và nó đã thực thi một trong các chương trình trong thư mục của tôi. Tại sao?

Dự đoán tốt nhất của tôi là Unix đã coi nó như một ký tự đại diện để nó thực hiện chương trình chữ cái đầu tiên. Vì my_program.exeone_of_my_programs.programcó thể được thực thi bằng cách chỉ cần gõ tên của tệp, toán tử ký tự đại diện cho tất cả các tệp có thể. Vì một chương trình đầu tiên theo thứ tự abc, Unix thực thi nó. Đây có phải là một phán đoán chính xác?


Tôi nghĩ rằng không phải tất cả các shell sắp xếp sự mở rộng của *bảng chữ cái, nhưng bash là một trong đó.
aschepler

1
@aschepler: tất cả các vỏ phù hợp POSIX phải; xem pubs.opengroup.org/onlinepub/9699919799/utilities/ nam para 3.
dave_thedom_085

Câu trả lời:


20

Giải thích của bạn là chính xác. Phần còn lại của các tệp sẽ được trình bày dưới dạng danh sách tham số của nó.

Lưu ý rằng nó sẽ chỉ làm điều này nếu chương trình có tập bit thực thi và thư mục hiện tại nằm trong PATHdanh sách.

Một vài lưu ý có thể giúp hiểu: -

  • Nếu bạn gõ ./*thì PATHmục không phải là một yêu cầu.
  • Nếu bạn nhập . *hoặc . ./*và tệp phù hợp đầu tiên là một tập lệnh, thì nó không cần phải được thực thi, cũng như không cần thư mục hiện tại PATH(có thể không đúng với các shell khác bash).

10
"Nó sẽ chỉ làm điều này thôi" - Nó có thể thú vị hơn. Nếu có một hàm shell, dựng sẵn hoặc một tệp thực thi trước đó PATHcó cùng tên với tệp đầu tiên thì lệnh khác này sẽ được thực thi. mkdir foo; cd foo; touch rm xyz; ls; *; ls.
Kamil Maciorowski

@KamilMaciorowski - Fair điểm: tuyên bố của tôi "nó sẽ làm điều này chỉ ..." quy định cần thiết điều kiện, nhưng không đủ người. Lệnh cũng sẽ hành xử khác nếu *là bí danh.
AFH

1
Kết luận: đừng làm điều này! Ngay cả khi bạn nghĩ rằng bạn có thể dựa vào thứ tự chữ cái mở rộng toàn cầu, lưu ý rằng thứ tự này phụ thuộc vào miền địa phương.
Aaron

ngoài . *hoặc . ./*một người có thể bash *(hoặc bất kỳ vỏ nào khác).
Olivier Dulac

11

Điều này cho thấy đó .là một phần của PATHbiến của bạn . Đó là một ý tưởng thực sự tồi tệ vì lý do bảo mật (một cách tự nhiên, Windows phải biến nó thành một mặc định không thể thay đổi).

Tuy nhiên, "đề xuất" này chỉ có giá trị nhẹ: nếu bạn có một tệp có tên rmtrong thư mục hiện tại của mình, *sẽ thực hiện tốt mặc định rm :

/tmp$ mkdir ohno
/tmp$ cd ohno
/tmp/ohno$ 
/tmp/ohno$ ls
/tmp/ohno$ touch rm what
/tmp/ohno$ ls
rm  what
/tmp/ohno$ *
/tmp/ohno$ ls
rm
/tmp/ohno$ 

Như bạn có thể thấy, nó không có rmtrong thư mục hiện tại (một tệp trống và không thể thực thi) đã được thực thi mà là mặc định của hệ thống /bin/rm.

Luôn kiểm tra kỹ các lệnh của bạn khi có ký tự đại diện. Đây là một trong những thông điệp đáng sợ nhất từng được đọc:

rm: cannot remove '.o': No such file or directory

Đây là kết quả của cuộc gọi

rm * .o

, ít nhiều vị trí tồi tệ nhất của một không gian giả mà người ta có thể nghĩ ra.


1
Sẽ không hại gì khi tạo một hàm rm()thêm -ivào các tham số hoặc kiểm tra các tham số và yêu cầu xác nhận nếu có nhiều hơn một số nhất định.
AFH

3
+1 cho "Đây là một trong những thông điệp đáng sợ nhất từng được đọc".
Mehrdad

+1 cho "Đó là một ý tưởng thực sự tồi tệ vì lý do bảo mật (tự nhiên, Windows phải biến nó thành một mặc định không thể thay đổi)."
Duncan X Simpson


Có một lý do chính đáng tại sao Windows biến nó thành một mặc định không thể thay đổi. Nó phải duy trì một chuỗi khả năng tương thích ngược từ những ngày trước khi DOS triển khai các thư mục. Hãy nhớ rằng những ngày không ai sử dụng PC có đĩa cứng và đĩa mềm đủ nhỏ để các thư mục ban đầu không cần thiết.
Muzer
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.