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 -
.
Và
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 bash
sẽ đọ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ì bash
phá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 --
và -
có thể hữu ích nói chung, hãy nghiên cứu ví dụ dưới đây.
cat
trong 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 -
và --
.
Hãy để một tập tin có tên foo
tồ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 --help
tồ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 --help
vớ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 ./--help
sẽ đượ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"