Điều kỳ diệu của “-” (dấu gạch ngang) trong các tham số dòng lệnh là gì?


101

Ví dụ:

  • Tạo ảnh ISO và ghi trực tiếp vào đĩa CD.

    mkisofs -V Photos -r /home/vivek/photos | cdrecord -v dev=/dev/dvdrw -

  • Thay đổi thư mục trước đó.

    cd -

  • Nghe trên cổng 12345 và dữ liệu được gửi đến nó.

    nc -l -p 12345 | tar xvzf -

Mục đích của dấu gạch ngang là gì và tôi sử dụng nó như thế nào?

Câu trả lời:


111

Nếu bạn muốn nói là không có -ở cuối tarlệnh, thì đó là điều phổ biến trên nhiều lệnh muốn sử dụng tệp.

Nó cho phép bạn xác định đầu vào hoặc đầu ra tiêu chuẩn chứ không phải là một thực tế tên tệp .

Đó là trường hợp cho ví dụ đầu tiên và thứ ba của bạn. Ví dụ: cdrecordlệnh đang lấy đầu vào tiêu chuẩn (luồng ảnh ISO được tạo bởi mkisofs) và ghi trực tiếp vào /dev/dvdrw.

Với cdlệnh, mỗi khi bạn thay đổi thư mục, nó sẽ lưu trữ thư mục mà bạn đến. Nếu bạn làm cdvới -"tên thư mục" đặc biệt , nó sẽ sử dụng thư mục đã nhớ đó thay vì một thư mục thực. Bạn có thể dễ dàng chuyển đổi giữa hai thư mục khá nhanh chóng bằng cách sử dụng nó.

Các lệnh khác có thể coi -là một giá trị đặc biệt khác .


9
lưu ý bạn cũng có thể sử dụng -cho các chi nhánh git, nghĩa là bạn có thể chuyển về chi nhánh trước đó của bạn vớigit checkout -
snappieT

3
Nơi nào trong tài liệu tar nó giải thích rằng nó được hỗ trợ? Làm cách nào để biết lệnh nào hỗ trợ nó?

1
Nếu một lệnh có ý nghĩa đặc biệt -, bạn có thể tìm thấy lời giải thích của nó trong trang nam.
codeforester

su - #make vỏ một vỏ đăng nhập
atongsa

Tôi thấy một lệnh như thế này rất tò mò: tar -cvf - / home | aescrypt -e -p táo -> backup_files.tar.aes thực chất là tar -cvf - / home | aescrypt -e -p táo -o backup_files.tar.aes - bởi vì piping char | nên làm cho sự hiện diện của dấu gạch ngang cuối cùng không cần thiết. Nhưng không có dấu gạch ngang cuối cùng, lệnh không thành công. Nghe có vẻ phi logic. Ai đó có thể vui lòng cho tôi một tài liệu tham khảo nơi ý nghĩa dấu gạch ngang trần trụi trong các dòng lệnh được giải thích. Tôi không thể tìm thấy bất kỳ.
elmclose

22

Nó không phải là phép thuật. Một số lệnh diễn giải -là người dùng muốn đọc từ stdin hoặc ghi vào stdout; không có gì đặc biệt về nó đối với vỏ.


9
Trừ trường hợp cd -; bash(1)xử lý cd -như thể bạn đã viết cd $OLDPWD.
sarnold

6
@sarnold Nhưng điểm giống nhau cd- một lệnh tích hợp trong shell - tự diễn giải một dấu gạch ngang. Không có "ma thuật" :-)

2
@pst, chắc chắn, không có ma thuật (đó là tất cả chỉ là mã :), nhưng có một cái gì đó đặc biệt về nó vào vỏ.
sarnold


9

-có nghĩa là chính xác ý nghĩa của mỗi lệnh. Có một số quy ước phổ biến và bạn đã thấy các ví dụ về hầu hết chúng trong các câu trả lời khác, nhưng không có quy ước nào phổ biến 100%.

Không có gì kỳ diệu về -nhân vật khi liên quan đến shell (ngoại trừ chính shell và một số lệnh tích hợp của nó như cdecho, sử dụng nó theo những cách thông thường). Một số ký tự, như \, '", "ma thuật", có ý nghĩa đặc biệt ở bất cứ nơi nào chúng xuất hiện. Đây là "siêu ký tự vỏ". -không phải là như thế.

Để xem cách sử dụng một lệnh đã cho -, hãy đọc tài liệu về lệnh đó .


7

Điều kỳ diệu là trong quy ước. Trong nhiều thiên niên kỷ, mọi người đã sử dụng '-' để phân biệt các tùy chọn với các đối số và đã sử dụng '-' trong tên tệp để có nghĩa là stdin hoặc stdout, nếu thích hợp. Đừng đánh giá thấp sức mạnh của quy ước!


Đừng đánh giá quá cao khả năng của mọi người trong việc phân biệt cách cư xử của lời nói với cách diễn đạt theo nghĩa đen. Điều này đã không diễn ra trong nhiều thiên niên kỷ.
tripleee

1
@tripleee - Đúng, nhưng nó đã diễn ra hàng tỷ giây. ;-)
David R Tribble

5

Nó có nghĩa là sử dụng luồng đầu vào chuẩn của chương trình.

Trong trường hợp của cd, nó có nghĩa là một cái gì đó khác: thay đổi thành thư mục làm việc trước đó.

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.