Em caso de dúvida, leia o código fonte. =)
Bash 4.3, shell.c
linha 830, na funçãoparse_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);
Em outras palavras, -
está dizendo que não há mais opções . Se houvesse mais palavras na linha de comando, elas seriam tratadas como um nome de arquivo, mesmo que a palavra iniciasse com a -
.
No seu exemplo, é claro, isso -
é completamente redundante, pois não há nada a seguir. Em outras palavras, bash -
é exatamente equivalente abash
.
Bash assume seus comandos
- de um arquivo de script, se for fornecido na linha de comando, ou
- não interativamente a partir do stdin, se o stdin não for um TTY (como no seu exemplo: stdin é um canal, o Bash executará o conteúdo desse URL como um script) ou
- interativamente se seu stdin for um TTY.
É um equívoco que bash -
diz ao Bash para ler seus comandos a partir de sua entrada padrão. Embora seja verdade que, no seu exemplo, o Bash leia seus comandos a partir do stdin, ele o faria independentemente de haver um -
na linha de comando, porque, como afirmado acima, bash -
é idêntico a bash
.
Para ilustrar melhor o que -
não significa stdin, considere:
O cat
comando foi projetado para interpretar a -
como stdin. Por exemplo:
$ 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
Em contraste, você não pode obter Bash para executar /bin/date
, em seguida, /bin/hostname
tentando este:
$ echo date | bash - hostname
/bin/hostname: /bin/hostname: cannot execute binary file
Em vez disso, ele tenta interpretar /bin/hostname
como um arquivo de script de shell, que falha porque é um monte de bobagens bizarras.
Você também não pode executar date +%s
usando 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
Você pode escrever xargs bash
? No. curl | xargs bash
invocaria bash com o conteúdo do script como argumentos de linha de comando. A primeira palavra do conteúdo seria o primeiro argumento e provavelmente seria mal interpretado como um nome de arquivo de script.
An argument of - is equivalent to --.
xargs
lo, ele funcionaria (no cenário limitado de um script de entrada suficientemente pequeno) com| xargs bash -c
; mas, na verdade, esse não é um uso útil ou idiomáticoxargs
.