У чому магія “-” (тире) у параметрах командного рядка?


101

Приклади:

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

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

  • Перехід до попереднього каталогу.

    cd -

  • Прослуховуйте на порту 12345 і надсилайте до нього дані untar.

    nc -l -p 12345 | tar xvzf -

Яке призначення тире і як його використовувати?

Відповіді:


111

Якщо ви маєте на увазі голою -в кінці tarкоманди, це звичайно для багатьох команд, які хочуть використовувати файл.

Це дозволяє вказати стандартний вхід або вихід, а не власне ім'я файлу.

Це стосується вашого першого та третього прикладу. Наприклад, cdrecordкоманда бере стандартний вхід (потік ISO, який виробляється mkisofs) і записує його безпосередньо в /dev/dvdrw.

За допомогою cdкоманди щоразу, коли ви змінюєте каталог, він зберігає каталог, з якого ви прийшли. Якщо ви працюєте cdзі спеціальним -"ім'ям каталогу", воно використовує запам’ятований каталог замість реального. Ви можете легко перемикатися між двома каталогами досить швидко, скориставшись цим.

Інші команди можуть трактувати -як інше спеціальне значення.


9
Зауважте, ви також можете використовувати -гілки git, тобто ви можете перейти до попередньої гілки за допомогоюgit checkout -
snappieT

3
Де в документах на tar пояснюється, що він підтримується? Як я можу знати, які команди підтримують його?

1
Якщо команда має особливе значення для -, ви можете пояснити її пояснення на сторінці man.
codeforester

su - # make shell shell оболонка для входу
atongsa

Я знаходжу команду на зразок цієї дуже цікавою: tar -cvf - / home | aescrypt -e -p яблука -> backup_files.tar.aes, що насправді є tar -cvf - / home | aescrypt -e -p яблука -o backup_files.tar.aes - тому, що діаграма з трубопроводами | повинен зробити присутність останнього тире непотрібним. Але без останнього тире команда не вдається. Звучить нелогічно. Хтось, будь ласка, дасть мені посилання, де пояснено значення голого тире в командних рядках. Я не можу знайти жодного.
elmclose

22

Це не магія. Деякі команди трактують -як користувача, який бажає читати зі stdin або записувати в stdout; до корпусу немає нічого особливого.


9
За винятком випадків cd -; bash(1)поводиться cd -так, ніби ви написали cd $OLDPWD.
sarnold

6
@sarnold Але справа в тому ж, cd- вбудована команда оболонки - інтерпретує сам тире. Ніякої "магії" :-)

2
@pst, звичайно, ніякої магії (це все просто код :), але в корпусі є щось особливе.
sarnold

13

Перенаправлення з або на stdinабо stdout.

Дивіться: http://tldp.org/LDP/abs/html/special-chars.html#DASHREF2


Як завжди, АБС потрібно приймати із зерном солі. Наприклад, це означає , що є Перенаправлення тут, але це відрізняється від операторів перенаправлення оболонкових ( <, >, |і т.д.).
трійчатка

10

-означає саме те, що кожна команда хоче, щоб це означало. Існує кілька загальних умов, і ви бачили приклади більшості з них у інших відповідях, але жодна з них не є на 100% універсальною.

Щодо -оболонки немає нічого магічного у персонажі (крім того, що сама оболонка та деякі її вбудовані команди люблять cdта echoвикористовують її звичайними способами). Деякі персонажі, як \, 'і ", є "магічними", мають особливі значення, де б вони не з'явилися. Це "метахарактеристики оболонок". -не такий.

Щоб побачити, як використовується дана команда -, прочитайте документацію для цієї команди .


7

Магія полягає в умові. Протягом тисячоліть люди використовували "-", щоб відрізняти параметри від аргументів, і використовували "-" у назви файлу для позначення або stdin, або stdout, як це доречно. Не варто недооцінювати силу умовності!


Не переоцінюйте здатність людей відрізнити манери мови від буквальних виразів. Це не тривало вже тисячоліття.
трійчатка

1
@tripleee - Правда, але це триває мільярди секунд. ;-)
David R Tribble

5

Це означає використовувати стандартний потік введення програми.

У випадку cd, це означає щось інше: змінити попередній робочий каталог.

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