15

В этом уроке нам нужно выполнить следующую команду:

# curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

Что означает последний - (дефис) после bash ?

Я видел много команд с этим, и не мог найти себе логическое объяснение и не нашел, как переформулировать поиск в Google. Это вывод команды piped?

2 ответа2

31

Bash ведет себя несколько нестандартно, когда дело доходит до - .

POSIX говорит:

Руководящий принцип 10:
Первый -- аргумент , что это не вариант, аргумент должен быть принят в качестве разделителя , указывающего конец опций. Любые последующие аргументы должны рассматриваться как операнды, даже если они начинаются с символа - .

[...]

Руководящий принцип 13:
Для утилит, которые используют операнды для представления файлов, которые должны быть открыты для чтения или записи, операнд - должен использоваться для обозначения только стандартного ввода (или стандартного вывода, когда из контекста ясно, что выходной файл указывается) или файла с именем - .

А также

В случае , когда утилита описана в томе Shell и утилит POSIX.1-2017 как соответствующие этим рекомендациям требуется принять, или не принимать, операнд - означает стандартный ввод или вывод, это использование объясняется в разделе операнды. В противном случае, если такая утилита использует операнды для представления файлов, то определяется реализация ли операнд - означает стандартный ввод (или стандартный вывод), или для файла с именем -

Но тогда man 1 bash пишет:

A -- сигнализирует об окончании опций и отключает дальнейшую обработку опций. Любые аргументы после -- обрабатываются как имена файлов и аргументы. Аргумент - эквивалентен -- .

Так что для Bash - означает ни стандартный ввод, ни файл, следовательно, несколько нестандартный.

Теперь ваш частный случай:

curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

Я подозреваю, что автор этой команды может не понять - эквивалентно -- в этом случае. Я подозреваю, что автор хотел убедиться, что bash будет читать из стандартного ввода, они ожидали - работать в соответствии с руководящими принципами 13.

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

Тем не менее - не работает в соответствии с руководящими принципами, он работает как -- . Тем не менее -- не нужно здесь , потому что нет никаких аргументов после него.

На мой взгляд последнее - ничего не меняет. Команда будет работать без него.

Чтобы увидеть, как -- и - может быть полезным в целом, изучите пример ниже.


cat в моем Kubuntu подчиняется обоим правилам, и я буду использовать это, чтобы продемонстрировать полезность - и -- .

Пусть существует файл с именем foo . Это распечатает файл:

cat foo

Пусть существует файл с именем --help . Это не будет печатать файл:

cat --help

Но это напечатает файл с именем --help:

cat -- --help

Это объединит файл с именем --help со всем, что поступает из стандартного ввода:

cat -- --help -

Кажется, вам на самом деле не нужно -- потому что вы всегда можете передать ./--help которая наверняка будет интерпретирована как файл. Но посмотрим

cat "$file"

когда вы не знаете заранее, что такое содержимое переменной. Вы не можете просто добавить ./ к нему, потому что это может быть абсолютный путь, и ./ сломает его. С другой стороны, это может быть файл с именем --help (потому что почему бы и нет?). В этом случае -- очень полезно; это намного более надежная команда:

cat -- "$file"
6

В man bash в конце односимвольных опций есть:-

--    A -- signals the end of options and disables further option processing.
      Any arguments after the -- are treated as filenames and arguments. An
      argument of - is equivalent to --.

Если вы процитировали полную команду, я не вижу причин для использования - после bash в этом случае, но это не вредит.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .