Là Globing một tính năng của vỏ?


12

Tôi đọc nhiều câu hỏi và câu trả lời như thế này và câu hỏi này

Tôi biết các ký tự đại diện được mở rộng bằng shell trước khi chạy lệnh và chúng là một tính năng của shell. Ngoài ra các ký tự đại diện làm việc với các lệnh có thể chấp nhận nhiều đối số. Trong trường find . -name *.rb hợp chúng tôi có nhiều hơn một tệp trong thư mục hiện tại findsẽ gây ra lỗi cho chúng tôi vì find không thể chấp nhận nhiều đối số và các cách để giải quyết vấn đề này là:

find . -name "*.rb"
find . -name '*.rb'
find . -name \*.rb

Chúng tôi thoát khỏi dấu hoa thị và ngăn chặn sự mở rộng của vỏ nhưng ký tự đại diện là một tính năng của vỏ; Khi chúng ta thoát khỏi dấu hoa thị không biết ý nghĩa của nó và nó sẽ tìm thấy một tệp có tên *.rb, vậy dấu hoa thị được mở rộng như thế nào trong trường hợp này?

Câu trả lời:


21

Có, shell hiểu *là tất cả các tệp có bất kỳ ký tự nào trong thư mục và *.rbnhư tất cả các tệp có bất kỳ ký tự nào và kết thúc .rb, và mở rộng nó như vậy.

Các findlệnh riêng của mình chấp nhận globbing.

Nếu bạn không trích dẫn *thì vỏ sẽ mở rộng nó trước khi các findlệnh thấy đối số của nó, vì vậy thay vì một glob *.rbtruyền cho find, tên của tất cả các file phù hợp với glob trong thư mục sẽ được chuyển đến find, và findsẽ cố gắng giải thích cho họ dưới dạng đối số, có khả năng dẫn đến lỗi hoặc ít nhất không phải là điều bạn muốn (nó sẽ chỉ hoạt động chính xác nếu không có tệp phù hợp trong thư mục hiện tại)


cảm ơn bạn, nó có nghĩa là chúng ta nói với vỏ nó không phải là một quả địa cầu nhưng một số lệnh có thể mở rộng các ký tự đại diện? hoặc chúng ta có thể nói nếu chúng ta có một cái vỏ mà không hiểu về việc tạo ra các lệnh thì những lệnh đó biết về việc tạo khối có thể mở rộng chúng không?
Sinoosh

5
nếu *được trích dẫn, thì shell sẽ không mở rộng nó và đối số bao gồm toàn cầu được truyền cho lệnh có thể hiểu toàn cầu - nó cũng tương tự đối với bất kỳ lệnh nào chấp nhận regex luôn luôn được trích dẫn ...
Zanna

1
Niềm vui của tôi ^ _ ^
Zanna

7
@Sinoosh: Lưu ý rằng không phải tất cả các lệnh đều hiểu cú pháp toàn cục. Nó chỉ là một tính năng củafind
slebetman

1
@Sinoosh Find không thực sự "mở rộng" ký tự đại diện, nó sử dụng nó như một thử nghiệm để khớp với từng tên tệp mà nó gặp. Có một số (rất) một số lệnh mở rộng ký tự đại diện theo nghĩa thông thường - giải nén và 7z có thể sử dụng nó để mở nhiều tài liệu lưu trữ ( [archive filename single argument] [list of files to extract]ví dụ khi các đối số của chúng thường có dạng " ").
Random832
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.