`-` используется только с CD?

45

cd - может переключаться между текущим и предыдущим каталогами.

Похоже, что раньше я -использовал в качестве аргументов другие команды, хотя я не помню, -означает ли if то же, что и с 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.
cuonglm
источник
36

cd -фактически является сокращением для cd "$OLDPWD" && pwd, где $OLDPWDустанавливается каждый раз, когда вы меняете каталоги на каталог, в котором вы только что находились.

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

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

Лоренс
источник
да, действительно, для этого нет правила.
Kiwy
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
dotancohen
источник
18

Любая программа может использовать -в качестве аргумента, чтобы означать все, что они хотят. Один общий пример su, в котором используется -как сокращение для --login. Единственное соглашение, которое я могу придумать, это то, что программы, которые читают из файлов, часто используют -для обозначения «читать из стандартного ввода» , но это полностью зависит от программы.

Михаил Мрозек
источник
Существуют ли стандартные или нестандартные соглашения для использования специальных символов в качестве аргументов?
Тим
2

Добавляя мои два цента здесь. Я использую '-', чтобы сказать инструменту ps2pdf для чтения из стандартного ввода, как ранее предлагали несколько человек:

man -t ls | ps2pdf - ls.pdf

Приведенный выше однострочный текст создает pdf-версию справочной страницы для ls в текущем каталоге.
Надеюсь, кто-то найдет это полезным :).

gacanepa
источник
2

Как отвечает gnouc , -имеет свое значение в cd.

Тем не менее, вы можете повторить поведение -других программ, используя ~-. Например:

cd /etc
cd /
ls ~-             #lists the contents of the /etc directory
vim ~-/fstab      #opens the file /etc/fstab in vim
Чираг Бхатия - чираг64
источник