Что делает “-” в “ударе -” средний?

Что делает bash - средний в следующем ударе окружают код? Это, кажется, используется для взятия вывода последний код в качестве входа. Если так, могу я просто записать это как bash или xargs bash?

curl --silent --location https://rpm.nodesource.com/setup | bash -
33
задан 28 November 2015 в 00:24

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);

Другими словами, - говорит, что больше нет опций. Если бы больше были слова на командной строке, то их рассматривали бы как имя файла, даже если слово, запущенное с a -.

В Вашем примере, конечно, этом - абсолютно избыточно, поскольку нет ничего после него так или иначе. Другими словами, bash - точно эквивалентно bash.


Bash берет свои команды

  1. из файла сценария, если это обеспечивается на командной строке, или
  2. нев интерактивном режиме от его stdin, если его stdin не является TTY (такой как в Вашем примере: stdin является каналом, таким образом, Bash выполнит содержание того URL как сценарий), или
  3. в интерактивном режиме, если его stdin является TTY.

Это - неправильное представление это 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 вызвал бы удар с содержанием сценария как параметры командной строки. Первое слово содержания было бы первым аргументом, и это будет, вероятно, неправильно истолковано как имя файла сценария.

36
ответ дан 23 November 2019 в 00:35

Другие вопросы по тегам:

Похожие вопросы: