В этом уроке нам нужно выполнить следующую команду:
# curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -
Что означает последний -
(дефис) после bash
?
Я видел много команд с этим, и не мог найти себе логическое объяснение и не нашел, как переформулировать поиск в Google. Это вывод команды piped?
linux
command-line
bash
pipe
Омар БИСТАМИ
источник
источник
sudo bash
звуки действительно страшны. Попробуйте найти учебник, который не поощряет такие практики.symbolhound.com
.Ответы:
Bash ведет себя несколько нестандартно, когда дело доходит до
-
.POSIX говорит:
И
Но тогда
man 1 bash
читает:Таким образом, для Bash не
-
подразумевается ни стандартный ввод, ни файл, следовательно, он несколько нестандартен.Теперь ваш частный случай:
Я подозреваю, что автор этой команды, возможно, не понимает
-
, эквивалентно--
в этом случае. Я подозреваю, что автор хотел убедиться, чтоbash
прочитает из его стандартного ввода, они ожидали, что будут-
работать в соответствии с руководящими принципами 13.Но даже если бы он работал в соответствии с руководящими принципами, здесь не
-
было бы необходимости, потому что онbash
определяет, когда его стандартный ввод является каналом, и действует соответствующим образом (если-c
не указано и т. Д.).Пока
-
не работает в соответствии с руководящими принципами, он работает как--
. Здесь все еще--
не нужно, потому что после него нет аргументов.На мой взгляд, последнее
-
ничего не меняет. Команда будет работать без него.Чтобы увидеть, как
--
и чем это-
может быть полезно в целом, изучите приведенный ниже пример.cat
в моем Kubuntu соблюдаются оба правила, и я буду использовать его, чтобы продемонстрировать полезность-
и--
.Пусть файл с именем
foo
существует. Это распечатает файл:Пусть файл с именем
--help
существует. Это не будет печатать файл:Но это напечатает файл с именем
--help
:Это объединит файл с именем,
--help
полученным от стандартного ввода:Кажется, вам на самом деле не нужно
--
, потому что вы всегда можете передать,./--help
что наверняка будет интерпретировано как файл. Но посмотримкогда вы не знаете заранее, что такое содержимое переменной. Вы не можете просто смириться
./
с этим, потому что это может быть абсолютный путь и./
сломать его. С другой стороны, это может быть файл с именем--help
(потому что почему бы и нет?). В этом случае--
очень полезно; это намного более надежная команда:источник
В
man bash
конце односимвольных опций есть: -Если вы процитировали полную команду, я не вижу никаких оснований для использования
-
после того, какbash
в данном случае, но это не делает никакого вреда.источник
-
, маловероятное требование, но-
/--
делает это возможным.cat file1 - file2 > file3
,bash -
значит чтоbash
ждет stdin. Таким образом, практически bash выполнит все, что возвращается командой слева от|
Аналогичный, но более простой пример:
echo hello | cat -
здесьcat
будет напечатано «привет». Почему? Потому что "привет" отправляется кошке через|
иcat
ждет, что-нибудь отправлено на негоТеперь давайте разберем всю команду на две части:
эта команда curl вернет что-то, что может быть понято и выполнено bash
то есть труба ,
|
которая будет посылать вывод , возвращаемый командой завитка , чтобы с правой стороны трубы , т.е.sudo -E bash -
. Наконецsudo -E bash -
, bash готов выполнить все, что ему отправленоисточник