Відповіді:
Коли ви сумніваєтесь, прочитайте вихідний код. =)
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 приймає свої команди
Це неправильне уявлення, яке 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 із вмістом скрипту як аргументи командного рядка. Перше слово вмісту буде першим аргументом, і воно, ймовірно, буде неправильно трактуватися як ім'я файлу сценарію.
An argument of - is equivalent to --.
xargs
натомість, він би працював (за обмеженим сценарієм достатньо невеликого сценарію введення) з | xargs bash -c
; але насправді це не корисне чи ідіоматичне використання xargs
.