Bash ведет себя несколько нестандартно, когда дело доходит до -
.
POSIX говорит:
Рекомендация 10.
Первый --
аргумент, который не является аргументом-параметром, должен быть принят в качестве разделителя, указывающего конец параметров. Любые последующие аргументы должны рассматриваться как операнды, даже если они начинаются с -
символа.
[...]
Рекомендация 13.
Для утилит, которые используют операнды для представления файлов, которые должны быть открыты для чтения или записи, -
операнд должен использоваться для обозначения только стандартного ввода (или стандартного вывода, когда из контекста ясно, что файл вывода указывается) или файл с именем -
.
И
Если требуется, чтобы утилита, описанная в томе «Shell and Utilities» 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"