Dấu gạch nối - có nghĩa là gì trong tiếng tar tar xzf - chà?


23

Khi cố gắng cài đặt dropbox từ dòng lệnh, tôi đọc các lệnh

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

những gì không -có nghĩa là ở đây? nó là thư mục trước?


9
Một chút về phương pháp giáo dục: tùy chọn bạn đang hỏi là f -. Điều này có thể làm cho việc tìm câu trả lời trong các trang nam dễ dàng hơn một chút.
sinh

4
Nó sẽ thực sự hữu ích nếu bạn có thể giải thích những gì, chính xác là không rõ ràng với bạn về tài liệu của wgettar. Bằng cách đó, các nhà phát triển tương ứng có thể cải thiện tài liệu của họ để người dùng trong tương lai không vấp phải vấn đề tương tự một lần nữa. Nói cách khác: hãy là một anh hùng và làm cho thế giới trở nên tốt đẹp hơn!
Jörg W Mittag

2
Nó sẽ là một mặc định tốt cho tar để sử dụng stdin, nhưng vì di sản của nó là làm việc với băng nên nó đã không làm điều đó. Thay vào đó, nó học cách làm việc với các tệp (với tùy chọn f) và sau đó tuân theo quy ước để có một - thay cho tên tệp cho stdin (Trong trường hợp eXtract hoặc stdout trong trường hợp Tạo)
eckes

1
@eckes Trong trường hợp GNU tar, stdin mặc định trừ khi $TAPEđược đặt.
chrylis -on đình công-

Câu trả lời:


42

Một số lệnh chấp nhận -thay cho tên tệp:

  • Để ghi vào đầu ra tiêu chuẩn thay vì vào một tệp có tên. Đây là những gì -đối số được thông qua wgetsau khi -Olàm.
  • Để đọc từ đầu vào tiêu chuẩn thay vì từ một tập tin được đặt tên. Đây là những gì các -đối số được thông qua tarsau xzf.

Lệnh bạn đã hiển thị tải xuống một tệp lưu trữ với wgetvà giải nén nó với tar. Để đạt được điều này, đầu ra của wgetđường ống ( |) đến đầu vào của tar. Đây là lý do tại sao wgetghi vào đầu ra tiêu chuẩn thay vì một tệp và tarđọc từ đầu vào tiêu chuẩn thay vì một tệp.


Tôi muốn nói "hầu hết các lệnh" thay vì chỉ "một số lệnh". Tôi tin rằng đó là một phần của đặc tả cú pháp tùy chọn POSIX.
Barmar

2
@Barmar Có và khô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, nên sử dụng toán hạ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 một tệp đầu ra đang được chỉ định) hoặc một tệp có tên -. . Vì vậy, nếu - là một toán hạng cho một "tùy chọn tệp" nó có ý nghĩa đặc biệt, thì nó phải là một toán tử stdin / stdout. Chương trình này miễn phí không phải là trường hợp đặc biệt và chỉ cần tìm tệp-
Bakuriu

(và thông thường trong những trường hợp bỏ qua tùy chọn sẽ giống như sử dụng -)
Bakuriu

@Bakuriu Tôi không thấy cách mà bác bỏ những gì tôi nói. Tôi nghi ngờ hầu hết các lệnh lấy các đối số tên tệp, vì vậy chúng được cho là tuân theo hướng dẫn đó. Nhưng có lẽ tôi nên coi nó là "hầu hết các lệnh hoạt động trên các tệp".
Barmar

1
@Barmar Một cách để làm theo hướng dẫn là từ chối đối xử -đặc biệt, coi nó như một tên tệp theo nghĩa đen. Cách duy nhất để đi ngược lại hướng dẫn là đối xử -đặc biệt nhưng với một số ý nghĩa khác ngoài những hướng dẫn mà hướng dẫn gợi ý.
Eliah Kagan

12

Đó chỉ là một tên tệp mà rất nhiều chương trình Unix diễn giải là "thay vì thực sự mở một tệp, hãy đọc từ stdin(hoặc ghi vào stdout)."

Điều đó có nghĩa là đọc từ đầu vào được truyền vào chương trình; trong trường hợp của bạn, đó là đầu ra của wget.


6
Nó thực sự là một tên tập tin ?
Eric Duminil

7
@EricDuminil Đó là một tên tệp theo nghĩa các chương trình chấp nhận nó ở một số nơi mà nếu không họ sẽ chỉ chấp nhận tên tệp, nhưng bạn đúng rằng đó không thực sự là tên thực của một tệp trong một thư mục.
JoL

5
@EricDuminil: Đặc biệt, đối với các chương trình tuân theo quy ước này, bạn phải sử dụng ./-nếu bạn thực sự muốn mở một tệp có tên -.
Jörg W Mittag

4
@EricDuminil Trong thực tế: có! Nó đặt tên cho một tập tin ; theo nghĩa unix, stdinlà một mô tả tập tin và -là tên bạn cung cấp để sử dụng đó. Tuy nhiên, đây không phải là tên tệp theo quan điểm của HĐH. Chỉ từ góc độ người dùng.
Marcus Müller

3
@rexkogitans không. /dev/stdinchỉ là một tên tệp tiện lợi được cung cấp bởi một số cơ sở hạt nhân. Thường không có fopen("/dev/stdin", "r") bất cứ điều xảy ra khi bạn viết một chương trình chọn sử dụng stdin; bạn chỉ cần tiếp tục và sử dụng extern FILE* stdintiêu đề libc của bạn đã cung cấp cho bạn; Nhân tiện, đó là mô tả tập tin số nguyên 0.
Marcus Müller

5

Đối -số để tarchỉ định rằng kho lưu trữ nên được đọc từ stdinthay vì một tệp. Từ hướng dẫn sử dụng GNU tar :

Nếu bạn sử dụng -làm tên lưu trữ , hãy tarđọc tệp lưu trữ từ đầu vào tiêu chuẩn (khi liệt kê hoặc giải nén tệp)

Các lệnh khác có cùng hành vi và được quy định bởi tiêu chuẩn POSIX.1-2017 :

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ỉ có nghĩa là đầ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 tệp được đặt tê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.