Risposte:
In caso di dubbi, leggi il codice sorgente. =)
Bash 4.3, shell.c
linea 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 cat
comando è 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/date
quindi /bin/hostname
provando questo:
$ echo date | bash - hostname
/bin/hostname: /bin/hostname: cannot execute binary file
Piuttosto, cerca di interpretare /bin/hostname
come un file di script di shell, che fallisce perché è un mucchio di gobbledygook binari.
Non è possibile eseguire date +%s
utilizzando 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 bash
invece? No. curl | xargs bash
invocherebbe 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 --.
xargs
invece 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
.