В чем волшебство знака «-» (тире) в параметрах командной строки?

102

Примеры:

  • Создайте ISO-образ и запишите его прямо на компакт-диск.

    mkisofs -V Photos -r /home/vivek/photos | cdrecord -v dev=/dev/dvdrw -

  • Перейти в предыдущий каталог.

    cd -

  • Слушайте порт 12345 и распаковывайте отправленные на него данные.

    nc -l -p 12345 | tar xvzf -

Для чего нужен тире и как его использовать?

Chemila
источник

Ответы:

113

Если вы имеете в виду голый текст -в конце tarкоманды, это характерно для многих команд, которые хотят использовать файл.

Это позволяет вам указать стандартный ввод или вывод, а не фактический имя файла.

Так обстоит дело с вашим первым и третьим примером. Например, cdrecordкоманда принимает стандартный ввод (поток образа ISO, созданный с помощью mkisofs) и записывает его непосредственно в /dev/dvdrw.

С помощью cdкоманды каждый раз, когда вы меняете каталог, он сохраняет каталог, из которого вы пришли. Если вы сделаете это cdсо специальным -«именем каталога», он будет использовать этот запомненный каталог вместо реального. Используя это, вы можете легко переключаться между двумя каталогами довольно быстро.

Другие команды могут рассматриваться -как другое специальное значение.

Paxdiablo
источник
9
обратите внимание, что вы также можете использовать его -для веток git, т.е. вы можете вернуться к своей предыдущей ветке с помощьюgit checkout -
snappieT
3
Где в документации tar объясняется, что он поддерживается? Как узнать, какие команды его поддерживают?
1
Если команда имеет особое значение -, вы можете найти ее объяснение на странице руководства.
codeforester
su - # сделать оболочку оболочкой входа в систему
atongsa
Мне очень любопытна такая команда: tar -cvf - / home | aescrypt -e -p apples -> backup_files.tar.aes, который на самом деле является tar -cvf - / home | aescrypt -e -p apples -o backup_files.tar.aes - потому что символ конвейера | должен сделать ненужным наличие последнего тире. Но без последнего тире команда не работает. Звучит нелогично. Может ли кто-нибудь дать мне ссылку, где объясняется значение голого тире в командных строках. Я не могу найти ни одного.
elmclose
22

Это не волшебство. Некоторые команды интерпретируются -как пользователь, желающий читать из стандартного ввода или писать в стандартный вывод; в оболочке нет ничего особенного.

Игнасио Васкес-Абрамс
источник
9
За исключением случая cd -; bash(1)обрабатывает, cd -как если бы вы писали cd $OLDPWD.
sarnold 08
6
@sarnold Но суть в том же cd- встроенная команда оболочки - сама интерпретирует тире. Никакой "магии" :-)
2
@pst, конечно, никакой магии (это всего лишь код :), но в оболочке есть что-то особенное.
sarnold 08
13

Перенаправление с или на stdinили stdout.

См. Http://tldp.org/LDP/abs/html/special-chars.html#DASHREF2

Ry-
источник
Как всегда, к ABS нужно относиться с недоверием. Например, это означает , что есть Перенаправление здесь, но это отличается от операторов перенаправления оболочечных ( <, >, |и т.д.).
Tripleee
10

-означает именно то, что каждая команда хочет означать. Существует несколько общих соглашений, и вы видели примеры большинства из них в других ответах, но ни одно из них не является универсальным на 100%.

Что -касается оболочки, то в этом персонаже нет ничего волшебного (за исключением того, что сама оболочка и некоторые из ее встроенных команд, таких как cdи echo, используют его обычными способами). Некоторые символы, например \, 'и ", являются «волшебными», имея особое значение, где бы они ни появлялись. Это «метасимволы оболочки». -это не так.

Чтобы узнать, как используется данная команда -, прочтите документацию по этой команде .

Кейт Томпсон
источник
7

Магия в условности. На протяжении тысячелетий люди использовали знак «-», чтобы отличать параметры от аргументов, и использовали знак «-» в имени файла для обозначения либо stdin, либо stdout, в зависимости от ситуации. Не стоит недооценивать силу условностей!

Уильям Перселл
источник
Не переоценивайте способность людей отличать манеру речи от буквальных выражений. Этого не происходило тысячелетиями.
Tripleee
1
@tripleee - Верно, но это продолжается уже миллиарды секунд. ;-)
Дэвид Р Триббл
5

Это означает использование стандартного входного потока программы.

В случае с cd, это означает другое: перейти в предыдущий рабочий каталог.

Брайан Кейн
источник