`-` используется только с 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.

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

18

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


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

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.