Що означає дефіс "-" в "tar xzf -"?


23

Коли я намагаюся встановити dropbox з командного рядка, я читаю команди

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

що -тут означає? це попередній каталог?


9
Трохи педантизму: варіант, про який ви питаєте, - це f -. Це може полегшити пошук відповіді на довідкових сторінках.
studog

4
Було б дуже корисно, якби ви могли пояснити, що саме вам незрозуміло щодо документації wgetта tar. Таким чином, відповідні розробники можуть вдосконалити свою документацію, щоб майбутні користувачі знову не стикалися з тими ж проблемами. Іншими словами: будьте героєм і зробіть світ кращим!
Йорг W Міттаг

2
Це було б чудово за замовчуванням для tar, щоб використовувати stdin, але оскільки його спадщина - це робота зі стрічками, цього не робило. Натомість він навчився працювати з файлами (з опцією f), а потім слідує умові мати на місці імені файлу stdin (У разі eXtract або stdout у разі створення)
eckes

1
@eckes У випадку GNU tar, типовим є stdin , якщо $TAPEне встановлено.
chrylis -на страйк-

Відповіді:


42

Деякі команди приймають -замість імені файлу:

  • Записати на стандартний вихід замість іменованого файлу. Це те, про що йде -аргумент, переданий wgetпісля -O.
  • Читати зі стандартного вводу замість названого файлу. Це те, що -аргумент передається tarпісля xzf.

Команда, яку ви показали, завантажує архівний файл wgetі розпаковує його tar. Для досягнення цієї мети, вихід wgetIS конвеєра ( |) на вхід tar. Ось чому wgetпише на стандартний вихід замість файлу і tarчитає зі стандартного вводу замість файлу.


Я б сказав "більшість команд", а не просто "деякі команди". Я вважаю, що це частина специфікації синтаксису опції POSIX.
Бармар

2
@Barmar Так і ні: Посібник 13: Утиліти, які використовують операнди для представлення файлів, відкритих для читання чи запису, операнд '-' повинен використовуватися для позначення лише стандартного вводу (або стандартного виводу, коли з контексту видно, що задається вихідний файл) або файл з іменем -. . Отже, якщо - це операнд для "параметра файлу" і він має особливе значення, то він повинен бути таким, як stdin / stdout. Програма безкоштовно не розглядає як окремий випадок і просто шукайте файл-
Bakuriu

(і, як правило, у цих випадках пропущення опції буде таким же, як і використання -)
Бакуріу,

@Bakuriu Я не бачу, як це спростовує те, що я сказав. Я підозрюю, що більшість команд беруть аргументи назви файлів, тому вони повинні дотримуватися цієї інструкції. Але, можливо, я мав би кваліфікувати це як "більшість команд, які працюють над файлами".
Бармар

1
@Barmar Один з способів слідувати керівництво повинно знижуватися для лікування -особливо взагалі, розглядаючи його як буквальне ім'я файлу. Єдиний спосіб іти проти настанови - це поводитися -спеціально, але з іншим значенням, ніж ті, що пропонує керівництво.
Елія Каган

12

Це лише ім'я файлу, яке багато програм Unix інтерпретують як "замість того, щоб насправді відкривати файл, читати з stdin(або писати в stdout)".

Це означає читання з входу, який надходить в програму; у вашому випадку це вихід wget.


6
Це справді ім'я файлу ?
Ерік Думініл

7
@EricDuminil Це ім'я файлу в тому сенсі, що програми приймають його в тих місцях, де в іншому випадку вони приймають би лише імена файлів, але ви праві, що справа не в дійсному імені файлу в деякому каталозі.
JoL

5
@EricDuminil: Зокрема, для програм , які слідують до цієї угоди, ви повинні використовувати , ./-якщо ви на самому справі хочете , щоб відкрити файл з ім'ям -.
Йорг W Міттаг

4
@EricDuminil Насправді: так! Вона імена в File ; в сенсі Unix stdin- це дескриптор файлу, і -це ім'я, яке ви надаєте для його використання. Однак це не ім'я файлу з точки зору ОС. Тільки з точки зору користувача.
Маркус Мюллер

3
@rexkogitans немає. /dev/stdinце лише зручне ім'я файлу, яке пропонується деяким засобом ядра. Зазвичай ніде не fopen("/dev/stdin", "r") відбувається, коли ви пишете програму, яка вирішує використовувати stdin; ви просто продовжуйте користуватися тим, extern FILE* stdinщо вам надав ваш заголовок libc; до речі, це дескриптор цілого числа файлів 0.
Маркус Мюллер

5

-Аргумент tarспецифицирует , що архів слід читати stdinзамість файлу. З посібника з дьогтю GNU :

Якщо ви використовуєте -як ім'я архіву , він tarзчитує архів зі стандартного вводу (під час переліку або вилучення файлів)

Інші команди мають таку ж поведінку, і це визначено стандартом POSIX.1-2017 :

Настанова 13 :

Для утиліт, які використовують операнди для представлення файлів, відкритих для читання чи запису, ' -' операнд повинен використовуватися для позначення лише стандартного вводу (або стандартного виводу, коли з контексту зрозуміло, що файл виводу задається) або файлу названий -.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.