以下 bash shell 代码中的是什么bash -
意思?它似乎用于将输出的最后一个代码作为输入。如果是这样,我可以将其写为bash
或 吗xargs bash
?
curl --silent --location https://rpm.nodesource.com/setup | bash -
答案1
如有疑问,请阅读源代码。=)
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);
换句话说-
,没有更多选择。如果命令行上还有其他单词,它们将被视为文件名,即使该单词以-
. 开头。
当然,在你的例子中,这-
完全是多余的,因为它后面没有任何内容。换句话说,bash -
完全等同于bash
。
Bash 接受命令
- 如果在命令行中提供了脚本文件,或者
- 如果其 stdin 不是 TTY,则以非交互方式从其 stdin 执行(例如在您的示例中:stdin 是一个管道,因此 Bash 将以脚本形式执行该 URL 的内容),或者
- 如果其 stdin 是 TTY,则以交互方式进行。
bash -
告诉 Bash 从其标准输入读取命令是一种误解。是确实,在您的示例中,Bash 将从 stdin 读取其命令,无论命令行上是否有-
,它都会这样做,因为如上所述,bash -
与相同bash
。
为了进一步说明这-
并不意味着标准输入,请考虑:
该
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
为一个 shell 脚本文件,但由于它是一堆二进制乱码,因此会失败。您无法
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
会使用脚本内容作为命令行参数来调用 bash。内容的第一个字将是第一个参数,并且很可能会被误解为脚本文件名。
答案2
该命令的目的是将 curl 命令的输出通过管道传输到 bash,以便它立即执行 curl 返回的命令。基本上,它告诉 bash 从 stdin 获取输入。请参阅https://superuser.com/a/1494190/234355
但是,在同一个答案中,有一些关于这是否真的有效的讨论。如果您只执行问题中命令的第一部分curl --silent --location https://rpm.nodesource.com/setup
,它将输出一个有效的 bash 脚本。我没有尝试,因为不想执行来自互联网的一些未知脚本。