Что делает bash -
средний в следующем ударе окружают код? Это, кажется, используется для взятия вывода последний код в качестве входа. Если так, могу я просто записать это как bash
или xargs bash
?
curl --silent --location https://rpm.nodesource.com/setup | bash -
Когда в сомнении, считайте исходный код.=)
Bash 4.3, shell.c
строка 830, в функции parse_shell_options()
:
/* A single `-' signals the end of options. From the 4.3 BSD sh.
An option `--' means the same thing; this is the standard
getopt(3) meaning. */
if (arg_string[0] == '-' &&
(arg_string[1] == '\0' ||
(arg_string[1] == '-' && arg_string[2] == '\0')))
return (next_arg);
Другими словами, -
говорит, что больше нет опций. Если бы больше были слова на командной строке, то их рассматривали бы как имя файла, даже если слово, запущенное с a -
.
В Вашем примере, конечно, этом -
абсолютно избыточно, поскольку нет ничего после него так или иначе. Другими словами, bash -
точно эквивалентно bash
.
Bash берет свои команды
Это - неправильное представление это bash -
говорит Bash читать свои команды из его стандартного входа. В то время как это верно, что в Вашем примере, Bash считает свои команды из stdin, это сделало бы так независимо от того, был ли a -
на командной строке, потому что, как указано выше, bash -
идентично bash
.
Далее проиллюстрировать это -
не означает stdin, рассматривает:
cat
команда разработана для интерпретации a -
как stdin. Например:
$ echo xxx | cat /etc/hosts - /etc/shells
127.0.0.1 localhost
xxx
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/bin/zsh
/usr/bin/zsh
/usr/bin/screen
/bin/tcsh
/usr/bin/tcsh
/usr/bin/tmux
/bin/ksh93
Напротив, Вы не можете заставить Bash выполняться /bin/date
затем /bin/hostname
путем попытки этого:
$ echo date | bash - hostname
/bin/hostname: /bin/hostname: cannot execute binary file
Скорее это пытается интерпретировать /bin/hostname
как файл сценария оболочки, который перестал работать, потому что это - набор двоичной напыщенности речи.
Вы не можете выполниться date +%s
использование bash -
также.
$ date +%s
1448696965
$ echo date | bash -
Sat Nov 28 07:49:31 UTC 2015
$ echo date | bash - +%s
bash: +%s: No such file or directory
Можно ли записать xargs bash
вместо этого? Нет. curl | xargs bash
вызвал бы удар с содержанием сценария как параметры командной строки. Первое слово содержания было бы первым аргументом, и это будет, вероятно, неправильно истолковано как имя файла сценария.