Risposte:
In caso di dubbi, leggi il codice sorgente. =)
Bash 4.3, shell.clinea 830, in funzioneparse_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);
In altre parole, -sta dicendo che non ci sono più opzioni . Se ci fossero altre parole sulla riga di comando, verrebbero trattate come un nome file, anche se la parola inizia con a -.
Nel tuo esempio, ovviamente, questo -è completamente ridondante, poiché comunque non c'è nulla che lo segua. In altre parole, bash -è esattamente equivalente abash .
Bash prende i suoi comandi
È un malinteso che bash -dice a Bash di leggere i suoi comandi dal suo input standard. Mentre è vero che nel tuo esempio, Bash leggerà i suoi comandi da stdin, lo avrebbe fatto indipendentemente dal fatto che ci fosse un -sulla riga di comando, perché, come detto sopra, bash -è identico a bash.
Per illustrare ulteriormente che -ciò non significa stdin, considerare:
Il catcomando è progettato per interpretare un -come stdin. Per esempio:
$ 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
Al contrario, non puoi far eseguire Bash /bin/datequindi /bin/hostnameprovando questo:
$ echo date | bash - hostname
/bin/hostname: /bin/hostname: cannot execute binary file
Piuttosto, cerca di interpretare /bin/hostnamecome un file di script di shell, che fallisce perché è un mucchio di gobbledygook binari.
Non è possibile eseguire date +%sutilizzando bash -neanche.
$ 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
Puoi scrivere xargs bashinvece? No. curl | xargs bashinvocherebbe bash con il contenuto dello script come argomenti della riga di comando. La prima parola del contenuto sarebbe il primo argomento e probabilmente verrebbe interpretata erroneamente come un nome file di script.
An argument of - is equivalent to --.
xargsinvece volessi davvero usarlo , funzionerebbe (nello scenario limitato di uno script di input abbastanza piccolo) con | xargs bash -c; ma in realtà, questo non è un uso utile o idiomatico di xargs.