Câu trả lời:
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 -f
tù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/0
hoặ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.
STDOUT
, tùy thuộc vào bối cảnh.
/dev/stdin
hoặc /dev/stdout
có 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)
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 bash
bạ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
cat
xử lý -
(kiểm tra trang chủ). Một phiên bản dựng sẵn của vỏ cat
có 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/stdin
hoặ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 cat
và diff
, cả hai đều hiểu rõ dấu gạch ngang.
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 f
cờ ở đâ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 gzip
chính nó bằng cách chỉ định z
cờ:
tar xfz filename
- Không cần gọi gzip
rõ ràng.
tar
có z
.
tar
mặc định cho ổ đĩa băng đầu tiên, vì lý do lịch sử.
/dev/sa0
trên FreeBSD 9.0, /dev/rst0
trê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.
tar
để mặc định cho ổ đĩa băng thứ hai , vì những lý do rõ ràng. :)
-
không cần ở cuối lệnh. Ví dụ :ls -l | diff - /old_ls_output.txt
.