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"