Чи використовується `-` тільки з компакт-диском?


45

cd - може перемикатися між поточним dir та попереднім dir.

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

Я виявив, що -це не працює ls.

Є чи - використовуватися тільки з компакт - диска?


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

6
Я весь час використовую git checkout -для переходу до попередньої гілки
wim

@fluffy: Чи -використовуються інші вбудовані так само?
Тім

Для деяких з вбудованих файлів, таких як " pushdтак". Інакше значення «попереднього каталогу» не є надзвичайно корисним за замовчуванням.
пухнастий

1
Можливо, ви думаєте про особливість '~ -' bash (що трактується як $ OLDPWD). Це можна використовувати з 'ls' у описаному вами способі.
абонет

Відповіді:


22

В рекомендації утиліта синтаксис POSIX ( в Зокрема , # 13) вказують , що за комунальні послуги , які очікують ім'я файлу для читання з, -засоби стандартного введення, а також за комунальні послуги , які очікують ім'я файлу для запису в, -засоби стандартний висновок. Наприклад, cat somefile -копіюється вміст somefileна його стандартний висновок з подальшим прочитанням на його стандартному вході.

Це керівництво не застосовується до cdкоманди, оскільки воно не читає і не записує у файл. cdробить щось інше: аргумент -означає «попередній каталог». Команда cd -еквівалентна cd "$OLDPWD" && pwd. Така поведінка характерна як для cdкоманди, так і для безпосередньо надиханих команд, таких як pushd.

Зауважте, що -це операнд, а не варіант. Лише аргументи, які починаються -і не є просто, -або --є варіантами. Основний сенс бути операндом - це те, --що не впливає на його особливий сенс. Наприклад, cd -- -Pзміни в підкаталозі, який називається -P, але cd -- -це те саме cd -, що він не змінюється до каталогу, який називається -. Так само cat -- -не читається з файла, який називається, -але зі стандартного вводу.


46

-визначено в Посібниках з синтаксису утиліти POSIX як стандартне введення:

Guideline 13:
For utilities that use operands to represent files to be opened for either 
reading or writing, the '-' operand should be used to mean only standard input 
(or standard output when it is clear from context that an output file is being 
specified) or a file named -.

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

Крім того, POSIX також визначає -власне значення з cd :

-
    When a <hyphen> is used as the operand, this shall be equivalent to the 
    command:

    cd "$OLDPWD" && pwd

    which changes to the previous working directory and then writes its name.

36

cd -насправді це скорочення cd "$OLDPWD" && pwd, де $OLDPWDвстановлюється кожен раз, коли ви змінюєте каталоги в каталог, в якому ви тільки що знаходилися.

Обробка даних -залежить від програми. Деякі програми використовують -для позначення STDIN, наприклад grep,awk

Інші програми можуть використовувати -як скорочення для всього, що вони вибирають, як вказує відповідь Майкла su, -- це скорочення--login


так, справді для цього немає правила.
Ківі

2
@Kiwy: У POSIX існує правило для цього, дивіться мою відповідь.
cuonglm

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

19

Хоча Майкл згадує, що suі інші програми можуть використовувати -для того, щоб означати все, що вони хочуть (читання з stdin є загальним), Git використовує так, -як cdце робиться , для зміни гілок.

$ git status
On branch master

$ git checkout foobar
$ git status
On branch foobar

$ git checkout -
$ git status
On branch master

18

Будь-яка програма може використовувати -як аргумент, щоб означати все, що вони хочуть. Один поширений приклад su, який використовується -як скорочення --login. Єдиною умовою, яку я можу придумати, є те, що програми, які читають з файлів, часто використовують -для позначення "читати зі stdin" , але це повністю залежить від програми


Чи існують стандартні чи нестандартні умови для використання спеціальних символів як аргументів?
Тім

2

Додаю сюди два мої центи. Я використовую "-", щоб сказати інструменту ps2pdf читати зі стандартного вводу, як раніше запропонували кілька людей:

man -t ls | ps2pdf - ls.pdf

Наведений вище вкладиш створює pdf версію довідкової сторінки для ls у поточному каталозі.
Сподіваюся, хтось вважає це корисним :).


2

Як відповів gnouc , -має власне значення в cd.

Однак ви можете повторити поведінку -інших програм, використовуючи ~-. Наприклад:

cd /etc
cd /
ls ~-             #lists the contents of the /etc directory
vim ~-/fstab      #opens the file /etc/fstab in vim
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.