Chữ cuối cùng - Tiếng (dấu gạch ngang) có nghĩa gì trong các tùy chọn của `bash`?


15

Trong hướng dẫn này, chúng ta cần thực hiện lệnh sau:

# curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

Những gì cuối cùng -(gạch nối) sau bashcó nghĩa là gì?

Tôi đã thấy rất nhiều lệnh với điều này và không thể tìm cho mình một lời giải thích hợp lý và cũng không tìm thấy cách cải tổ một tìm kiếm google cho nó. Nó có phải là đầu ra của lệnh piped không?



2
Tải nội dung từ mạng và dẫn trực tiếp vào sudo bashâm thanh thực sự đáng sợ. Hãy thử tìm kiếm một hướng dẫn không khuyến khích thực hành như vậy.
hmakholm còn lại trên Monica

Của nó NPM hướng dẫn, nhưng tôi đồng ý với bạn ...
Omar BISTAMI

1
Nếu bạn cần tìm kiếm những thứ có biểu tượng trong đó, hãy thử symbolhound.com.
Joe

Câu trả lời:


31

Bash hành xử theo cách hơi không chuẩn khi nói đến -.

POSIX nói:

Hướng dẫn 10:
Đối --số đầu tiên không phải là đối số tùy chọn nên được chấp nhận làm dấu phân cách chỉ ra kết thúc của các tùy chọn. Bất kỳ đối số nào sau đây nên được coi là toán hạng, ngay cả khi chúng bắt đầu bằng -ký tự.

[Càng]

Hướng dẫn 13:
Đối với các tiện ích sử dụng toán hạng để thể hiện các tệp được mở để đọc hoặc ghi, -toán hạng chỉ nên được sử dụng để chỉ đầu vào tiêu chuẩn (hoặc đầu ra tiêu chuẩn khi rõ ràng trong bối cảnh tệp đầu ra được chỉ định) hoặc a tập tin có tên -.

Khi một tiện ích được mô tả trong khối Shell và Tiện ích của POSIX.1-2017 tuân thủ các nguyên tắc này là bắt buộc phải chấp nhận hoặc không chấp nhận, toán hạng -có nghĩa là đầu vào hoặc đầu ra tiêu chuẩn, việc sử dụng này được giải thích trong phần OPERANDS. Mặt khác, nếu một tiện ích như vậy sử dụng toán hạng để biểu diễn các tệp, thì nó được xác định theo thực thi cho dù toán hạng -là viết tắt của đầu vào tiêu chuẩn (hoặc đầu ra tiêu chuẩn) hoặc cho một tệp có tên -.

Nhưng sau đó man 1 bashđọc:

A --báo hiệu kết thúc các tùy chọn và vô hiệu hóa xử lý tùy chọn thêm. Bất kỳ đối số sau khi --được coi là tên tệp và đối số. Một đối số -tương đương với --.

Vì vậy, đối với Bash -có nghĩa là không phải đầu vào tiêu chuẩn cũng như một tệp, do đó có phần không chuẩn.

Bây giờ trường hợp cụ thể của bạn:

curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

Tôi nghi ngờ tác giả của lệnh này có thể không nhận ra -là tương đương với --trong trường hợp này. Tôi nghi ngờ tác giả muốn đảm bảo bashsẽ đọc từ đầu vào tiêu chuẩn của nó, họ dự kiến ​​sẽ -làm việc theo hướng dẫn 13.

Nhưng ngay cả khi nó hoạt động theo hướng dẫn, -sẽ không cần thiết ở đây vì bashphát hiện khi đầu vào tiêu chuẩn của nó là một đường ống và hoạt động tương ứng (trừ khi -cđược đưa ra, v.v.).

Tuy nhiên, -không hoạt động theo hướng dẫn, nó hoạt động như thế nào --. Vẫn --không cần thiết ở đây vì không có đối số sau nó.

Theo tôi những -thay đổi cuối cùng không có gì. Lệnh sẽ làm việc mà không có nó.

Để xem làm thế nào ---có thể hữu ích nói chung, hãy nghiên cứu ví dụ dưới đây.


cattrong Kubfox của tôi tuân theo cả hai hướng dẫn và tôi sẽ sử dụng nó để chứng minh tính hữu dụng của ---.

Hãy để một tập tin có tên footồn tại. Điều này sẽ in các tập tin:

cat foo

Hãy để một tập tin có tên --helptồn tại. Điều này sẽ không in các tập tin:

cat --help

Nhưng điều này sẽ in tệp có tên --help:

cat -- --help

Điều này sẽ nối các tệp có tên --helpvới bất cứ thứ gì đến từ đầu vào tiêu chuẩn:

cat -- --help -

Có vẻ như bạn không thực sự cần --, bởi vì bạn luôn có thể vượt qua ./--helpsẽ được hiểu là một tệp chắc chắn. Nhưng hãy xem xét

cat "$file"

khi bạn không biết trước nội dung của biến là gì. Bạn không thể chỉ cần trả trước ./cho nó, bởi vì nó có thể là một con đường tuyệt đối và ./sẽ phá vỡ nó. Mặt khác, nó có thể là một tập tin có tên --help(vì tại sao không?). Trong trường hợp --này là rất hữu ích; Đây là một lệnh mạnh mẽ hơn nhiều:

cat -- "$file"

6

Trong man bashphần cuối của các tùy chọn ký tự đơn có: -

--    A -- signals the end of options and disables further option processing.
      Any arguments after the -- are treated as filenames and arguments. An
      argument of - is equivalent to --.

Nếu bạn đã trích dẫn lệnh hoàn chỉnh, tôi có thể thấy không có lý do để sử dụng -sau bashtrong trường hợp này, nhưng nó không có hại.


Cảm ơn bạn đã trả lời của bạn, Có tôi đã trích dẫn lệnh hoàn chỉnh. vì vậy, bất cứ điều gì sau - hoặc - sẽ không được xem là một tùy chọn mà là tên tệp hoặc đối số, bạn có thể vui lòng đưa ra một ví dụ hữu ích không?
Omar BISTAMI

1
Nó thực sự cho phép một kịch bản có tên bắt đầu -, một yêu cầu không thể, nhưng -/ --làm cho nó có thể.
AFH

1
@OmarBISTAMI Việc trích dẫn một lệnh sẽ ảnh hưởng đến cách trình bao mở rộng nó, nhưng sẽ không ảnh hưởng đến bất kỳ đối số nào tuân theo nó. Nếu bạn mở rộng các trích dẫn xung quanh các đối số hợp pháp, thì chúng trở thành một phần của tên lệnh không phải là điều bạn muốn. Có một số lệnh lấy tên tệp làm đối số, nhưng không sử dụng đầu vào tiêu chuẩn theo mặc định. Một ví dụ giả định cho phép bạn kẹp đầu vào (từ thiết bị đầu cuối hoặc đường ống) giữa hai tệp. cat file1 - file2 > file3.
Joe

1
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

bash -có nghĩa bashlà đang chờ stdin. Vì vậy, thực tế bash sẽ thực thi bất cứ điều gì được trả về bởi lệnh nằm bên trái của|

Một ví dụ tương tự nhưng dễ dàng hơn sẽ là:

echo hello | cat - ở đây, catsẽ in 'xin chào'. Tại sao? Bởi vì 'xin chào' đang được gửi đến mèo |catđang chờ đợi bất cứ điều gì được gửi đến nó

Bây giờ, hãy chia toàn bộ lệnh thành hai:

curl -sL https://rpm.nodesource.com/setup_6.x

lệnh curl này sẽ trả về một cái gì đó có thể được hiểu và thực hiện bằng bash

sau đó chúng ta có một đường ống |sẽ gửi đầu ra được trả về bằng lệnh curl sang bên phải của ống tức là sudo -E bash -. Cuối cùng sudo -E bash -, bash đã sẵn sàng để thực thi bất cứ điều gì được gửi đến nó

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.