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"