Що означає "-" в "bash -"?


33

Що bash -означає наступний код оболонки bash? Здається, використовується для отримання вихідного останнього коду як вхідного. Якщо так, то я можу просто написати це як bashчи xargs bash?

curl --silent --location https://rpm.nodesource.com/setup | bash -

Відповіді:


36

Коли ви сумніваєтесь, прочитайте вихідний код. =)

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. неінтерактивно від його stdin, якщо його stdin не є TTY (наприклад, у вашому прикладі: stdin - це труба, тому Bash буде виконувати вміст цієї URL-адреси як сценарій), або
  3. інтерактивно, якщо його stdin є TTY.

Це неправильне уявлення, яке bash -говорить Bash читати його команди зі свого стандартного вводу. Незважаючи на те , що це правда , що в вашому прикладі, Bash читатиме свої команди зі стандартного вводу, він зробив би так , незалежно від того, чи існує -в командному рядку, тому що, як було сказано вище,bash - є ідентичним bash.

Щоб додатково проілюструвати, що -не означає stdin, врахуйте:

  • catКоманда призначена для інтерпретації в -якості стандартного вводу. Наприклад:

    $ 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як файл сценарію оболонки, який не вдається, тому що це купа двійкових gobbledygook.

  • Ви не можете виконати з 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 із вмістом скрипту як аргументи командного рядка. Перше слово вмісту буде першим аргументом, і воно, ймовірно, буде неправильно трактуватися як ім'я файлу сценарію.


6
вимагають єдиної правильної відповіді.
geirha

Справді: зі слів An argument of - is equivalent to --.
manpage

Якщо ви насправді дуже хотіли використати xargsнатомість, він би працював (за обмеженим сценарієм достатньо невеликого сценарію введення) з | xargs bash -c; але насправді це не корисне чи ідіоматичне використання xargs.
трійка

@tripleee Якщо вміст URL-адреси що-небудь більше, ніж однолінійний, то рядки рядків та інші обмежувачі, ймовірно, будуть неправильними.
200_успіх

Ду, ти прав, звичайно.
трійка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.