Dấu gạch ngang - Hồi ở cuối lệnh có nghĩa là gì?


78

Đưa ra lệnh sau:

gzip -dc /cdrom/cdrom0/file.tar.gz | tar xvf 

Không những gì -ở phần cuối của lệnh nghĩa là gì? Đây có phải là một loại giữ chỗ?


3
Một chi tiết nhỏ cần đề cập: -không cần ở cuối lệnh. Ví dụ : ls -l | diff - /old_ls_output.txt.
manatwork

Câu trả lời:


82

Trong trường hợp này, nó có nghĩa là 'đầu vào tiêu chuẩn'. Nó được sử dụng bởi một số phần mềm (ví dụ tar) khi yêu cầu đối số tệp và bạn cần sử dụng stdin thay thế. Đây không phải là cấu trúc shell và nó phụ thuộc vào chương trình bạn đang sử dụng. Kiểm tra trang web nếu nghi ngờ!

Trong trường hợp này, đầu vào tiêu chuẩn là đối số cho -ftùy chọn. Trong trường hợp -không được hỗ trợ, bạn có thể thoát khỏi việc sử dụng một cái gì đó như tar xvf /proc/self/fd/0hoặc tar xvf /dev/stdin(cái sau được hỗ trợ rộng rãi trong các thông báo khác nhau).

Đừng dựa vào điều này để có nghĩa là 'đầu vào tiêu chuẩn' trên toàn cầu. Vì nó không được giải thích bởi shell nên mọi chương trình đều được tự do đối phó với nó khi nó vừa ý. Trong một số trường hợp, đó là đầu ra tiêu chuẩn hoặc một cái gì đó hoàn toàn khác: trên suđó biểu thị 'bắt đầu một vỏ đăng nhập'. Trong các trường hợp khác, nó hoàn toàn không được giải thích. Bộ nhớ cơ đã khiến tôi tạo ra một vài tệp có tên -vì một số phiên bản của một số chương trình tôi đã sử dụng để không hiểu dấu gạch ngang.


4
Nó cũng có thể có nghĩa STDOUT, tùy thuộc vào bối cảnh.
bahamat

3
Và hầu hết mọi thứ khác, tùy thuộc vào từng chương trình để giải thích.
Alexios

5
/dev/stdinhoặc /dev/stdoutcó thể được sử dụng nếu bạn thực sự muốn một luồng đầu vào / đầu ra. Lưu ý rằng đó là một luồng, các chương trình muốn tìm kiếm trong một tệp có thể không hoạt động đúng với nó như trường hợp với -(ví dụ: ffmpeg)
Lekensteyn

3
Trong trường hợp bash, dấu gạch nối được giải thích bởi shell. Xem Hướng dẫn Bash-Scripting nâng cao - Chương 3. Các ký tự đặc biệt , sau đó tìm kiếm văn bản [dash] hoặc "chuyển hướng từ / đến stdin hoặc stdout". Sử dụng bashbạn có thể sử dụng dấu gạch nối hầu hết các nơi mong đợi một tên tệp. Đó là một bổ sung rõ ràng cho <| > IMHO
bsd

4
Tôi không tin đó là trường hợp. Đầu tiên, catxử lý -(kiểm tra trang chủ). Một phiên bản dựng sẵn của vỏ catcó thể có hoặc không, nhưng đó không hoàn toàn là toàn bộ vỏ. Ngoài ra, nếu shell được xử lý -, bạn có thể nói echo -và nó sẽ mở rộng sang thứ khác. Thay vào đó, nó chỉ lặp lại một dấu gạch ngang (không /dev/stdinhoặc /proc/self/fd/0). Và echo test > -chỉ cần tạo một tệp được gọi -, vì vậy rõ ràng nó cũng không xử lý nó ở đó. Ồ, và trang bạn liệt kê không nói rằng nó được xử lý bởi trình bao , nó nói rằng bạn có thể sử dụng nó với catdiff, cả hai đều hiểu rõ dấu gạch ngang.
Alexios

13

Trong trường hợp này, điều -này thực sự khá vô dụng, giả sử bạn đang chạy Linux:

GNU tar (phiên bản trên Linux) chấp nhận đầu vào của nó từ đầu vào tiêu chuẩn theo mặc định. Nếu bạn không muốn hành vi này và muốn truyền tên tệp dưới dạng đối số dòng lệnh, thì bạn cần chỉ định cờ f:

tar xf filename

Vì vậy, điều này giống như

tar x < filename

Hoặc, nếu đầu vào được nén như trong ví dụ của bạn:

gzip -dc filename | tar x

Không có ý nghĩa gì khi chỉ định fcờ ở đây, nhưng vì đã được chỉ định, tên tệp cần phải được cung cấp -để cho biết rằng chúng tôi muốn đọc từ đầu vào tiêu chuẩn (xem câu trả lời khác). Vì vậy, để lặp lại, điều này là dư thừa và hơi kỳ lạ.

Hơn nữa, dòng trên có thể được đơn giản hóa vì GNU tar có thể được yêu cầu truyền luồng đầu vào thông qua gzipchính nó bằng cách chỉ định zcờ:

tar xfz filename

- Không cần gọi gziprõ ràng.


1
Lưu ý: không phải mọi tùy chọn đều tarz.
liori

2
Hầu hết các hệ điều hành khác ngoài Linux đều có tarmặc định cho ổ đĩa băng đầu tiên, vì lý do lịch sử.
Gilles

1
@Gilles BSD, OS X, Hoài . Nhưng tôi tò mò: những hệ thống nào khác ngoại trừ trong một vài máy tính lớn cũ vẫn sử dụng phiên bản như vậy (hệ thống nào ngoài máy tính lớn thậm chí còn ổ băng từ)?
Konrad Rudolph

1
@KonradRudolph Tất cả ba BSD chính mặc định cho một ổ đĩa băng ( /dev/sa0trên FreeBSD 9.0, /dev/rst0trên NetBSD 6.0 và OpenBSD 5.1). AIX 7.1 mặc định là /dev/rmt0. MINIX3 mặc định là /dev/sa0. (Tôi đã kiểm tra phiên bản HĐH mới nhất trong mỗi trường hợp, đây không phải là máy tính lớn cũ.) Solaris có thể định cấu hình thông qua một tệp trong /etcđó, tôi nghĩ mặc định là ổ đĩa băng. GNU tar, Schilling tar, OSX và BusyBox mặc định thành stdin / stdout.
Gilles

1
@Gilles - Tôi đã biên dịch lại tarđể mặc định cho ổ đĩa băng thứ hai , vì những lý do rõ ràng. :)
David Harkness
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.