问题描述
bash -
在以下bash shell代码中的含义是什么?它似乎用于将输出作为输入的最后一个代码。如果是这样,我可以把它写成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);
换句话说,-
表示没有其他选择。如果命令行中有更多单词,则它们将被视为文件名,即使单词以-
开头也是如此。
当然,在你的例子中,-
是完全冗余的,因为无论如何都没有任何关注它。换句话说,bash -
与bash
完全相同。
Bash接受命令
-
如果它是在命令行上提供的,则来自脚本文件,或
-
non-interactively来自其stdin,如果它的stdin不是TTY(例如在你的例子中:stdin是一个管道,所以Bash会将该URL的内容作为脚本执行),或者
-
交互式,如果它的标准输入是TTY。
bash -
告诉Bash从其标准输入读取命令是一种误解。虽然在您的示例中,Bash将从stdin读取其命令,但无论命令行上是否存在-
,它都会这样做,因为如上所述,bash -
与bash
相同。
为了进一步说明-
不代表stdin,请考虑:
-
cat
命令用于将-
解释为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脚本文件,该文件失败,因为它是一堆二进制gobbledygook。 -
您也无法使用
bash -
执行date +%s
。$ 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作为命令行参数。内容的第一个单词是第一个参数,它可能被误解为脚本文件名。