Що означає тире "-" наприкінці команди?


78

Дано таку команду:

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

Що означає -в кінці команди? Це якийсь заповнювач?


3
Ще одна невелика деталь, яку слід зазначити: -не потрібно бути в кінці команди. Наприклад: ls -l | diff - /old_ls_output.txt.
манатура

Відповіді:


82

У цьому випадку це означає «стандартний ввід». Він використовується деяким програмним забезпеченням (наприклад tar), коли потрібен аргумент файлу і вам потрібно використовувати stdin. Це не оболонка, і це залежить від програми, яку ви використовуєте. Перевірте сторінку, якщо сумніваєтеся!

У цьому випадку стандартний ввід є аргументом для -fпараметра. У випадках, коли -це не підтримується, ви можете піти, використовуючи щось на кшталт tar xvf /proc/self/fd/0або tar xvf /dev/stdin(останнє широко підтримується різними уніями).

Не покладайтеся на це, щоб загалом позначати «стандартний вклад». Оскільки це не інтерпретується оболонкою, кожна програма вільна поводитися з нею як завгодно. У деяких випадках це стандартний вихід або щось зовсім інше: на suньому позначається "запустити оболонку входу". В інших випадках це зовсім не трактується. М'язова пам'ять змусила мене створити досить багато файлів, названих -через те, що якась версія якоїсь програми, яку я використовував, не розуміла тире.


4
Це також може означати STDOUT, залежно від контексту.
bahamat

3
І майже все інше, оскільки інтерпретувати окремі програми.
Алексіос

5
/dev/stdinабо /dev/stdoutможна використовувати, якщо ви дійсно хочете введення / виводу потоку. Зауважте, що це потік, програми, які хочуть шукати у файлі, можуть працювати з ним неправильно, як це було б у випадку -(наприклад, ffmpeg)
Lekensteyn

3
У разі bash, дефіс буде інтерпретуватися оболонкою. Див. Розширений посібник із написання сценаріїв - Розділ 3. Спеціальні символи , потім знайди текст [тире] або "перенаправлення з / на stdin або stdout". Використовуючи bashви можете використовувати дефіс у більшості місць, де очікується ім’я файлу. Це очевидний додаток до <| > IMHO
bsd

4
Я не переконаний, що це так. По-перше, catручки -(перевірити вкладку). Вбудована в оболонку версія catможе і не може, але це не суворо вся оболонка. Крім того, якщо оболонка обробляється -, ви можете сказати відлуння, -і вона розшириться до чогось іншого. Натомість це просто перегукується тире (ні /dev/stdinчи /proc/self/fd/0). І echo test > -просто створюється файл, який називається -, тому він також чітко не обробляє його. О, і на перерахованій вами сторінці не сказано, що вона обробляється оболонкою , вона говорить про те, що ви можете користуватися нею, catі diffобидві чітко розуміють тире.
Олексій

13

У цьому випадку -фактично досить марно, якщо припустити, що ви працюєте з Linux:

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

tar xf filename

Так це те саме, що

tar x < filename

Або, якщо вхід gzipped, як у вашому прикладі:

gzip -dc filename | tar x

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

Крім того, вищезазначений рядок може бути спрощений, оскільки GNU tar можна сказати протікати вхід через gzipсебе, вказавши zпрапор:

tar xfz filename

- Не потрібно gzipчітко телефонувати .


1
Примітка: не кожен tarмає zможливість.
liori

2
Більшість ОС, окрім Linux, мають tarдефолт до першого накопичувача з історичних причин.
Жил

1
@Gilles і BSD, і OS X,…. Мені цікаво: які інші системи, за винятком кількох старих мейнфреймів, все ще використовують таку версію (які системи, крім мейнфреймів, навіть мають стрічковий накопичувач)?
Конрад Рудольф

1
@KonradRudolph Усі три основні BSD за замовчуванням для стрічкового накопичувача ( /dev/sa0на FreeBSD 9.0, /dev/rst0на NetBSD 6.0 та OpenBSD 5.1). За замовчуванням AIX 7.1 до /dev/rmt0. За замовчуванням MINIX3 до /dev/sa0. (Я перевірив останню версію операційної системи в кожному конкретному випадку, це не «старі мейнфрейми».) Solaris налаштовується через файл в /etc, який я думаю , по замовчуванням для накопичувача на магнітній стрічці. GNU tar, tar Schilling tar, OSX та BusyBox за замовчуванням для stdin / stdout.
Жиль

1
@Gilles - Я перекомпілював tarза замовчуванням другий магнітофон, з очевидних причин. :)
Девід Харкнесс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.