当前位置: 首页>>技术问答>>正文


“-”在“bash – ”中的含义是什么?

, ,

问题描述

bash -在以下bash shell代码中的含义是什么?它似乎用于将输出作为输入的最后一个代码。如果是这样,我可以把它写成bashxargs 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接受命令

  1. 如果它是在命令行上提供的,则来自脚本文件,或

  2. non-interactively来自其stdin,如果它的stdin不是TTY(例如在你的例子中:stdin是一个管道,所以Bash会将该URL的内容作为脚本执行),或者

  3. 交互式,如果它的标准输入是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作为命令行参数。内容的第一个单词是第一个参数,它可能被误解为脚本文件名。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6352.html,未经允许,请勿转载。