O Bash se comporta de maneira um pouco fora do padrão -
.
O POSIX diz:
Diretriz 10:
O primeiro --
argumento que não é um argumento de opção deve ser aceito como um delimitador indicando o final das opções. Quaisquer argumentos a seguir devem ser tratados como operandos, mesmo se começarem com o -
caractere.
[...]
Diretriz 13:
Para utilitários que usam operandos para representar arquivos a serem abertos para leitura ou gravação, o -
operando deve ser usado para significar apenas entrada padrão (ou saída padrão quando estiver claro no contexto que um arquivo de saída está sendo especificado) ou um arquivo nomeado -
.
E
Quando um utilitário descrito no volume Shell e Utilitários do POSIX.1-2017, em conformidade com estas diretrizes, é necessário para aceitar ou não aceitar, o operando -
para significar entrada ou saída padrão, esse uso é explicado na seção OPERANDS. Caso contrário, se esse utilitário usar operandos para representar arquivos, será definido pela implementação se o operando -
representa entrada padrão (ou saída padrão) ou um arquivo nomeado -
.
Mas então man 1 bash
lê:
A --
sinaliza o fim das opções e desativa o processamento adicional das opções. Quaisquer argumentos após o --
são tratados como nomes de arquivos e argumentos. Um argumento de -
é equivalente a --
.
Portanto, para Bash -
não significa entrada padrão nem arquivo, portanto, algo fora do padrão.
Agora seu caso particular:
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -
Eu suspeito que o autor deste comando pode não perceber que -
é equivalente a --
neste caso. Eu suspeito que o autor queria ter certeza bash
irá ler a partir de sua entrada padrão, que esperavam -
para trabalhar de acordo com a diretriz 13.
Mas, mesmo que funcionasse de acordo com a diretriz, -
seria desnecessário aqui porque bash
detecta quando sua entrada padrão é um tubo e age de acordo (a menos que -c
seja fornecido etc.).
No entanto -
, não funciona de acordo com a diretriz, funciona como --
. Ainda --
é desnecessário aqui porque não há argumentos após isso.
Na minha opinião, a última -
não muda nada. O comando funcionaria sem ele.
Para ver como --
e -
pode ser útil em geral, estude o exemplo abaixo.
cat
no meu Kubuntu obedece a ambas as diretrizes e vou usá-lo para demonstrar a utilidade de -
e --
.
Deixe um arquivo chamado foo
existir. Isso imprimirá o arquivo:
cat foo
Deixe um arquivo chamado --help
existir. Isso não imprimirá o arquivo:
cat --help
Mas isso imprimirá o arquivo chamado --help
:
cat -- --help
Isso concatenará o arquivo nomeado --help
com o que vier da entrada padrão:
cat -- --help -
Parece que você realmente não precisa --
, porque você sempre pode passar o ./--help
que será interpretado como um arquivo, com certeza. Mas considere
cat "$file"
quando você não sabe de antemão qual é o conteúdo da variável. Você não pode simplesmente anexá ./
-lo a ele, porque pode ser um caminho absoluto e ./
o quebraria. Por outro lado, pode ser um arquivo chamado --help
(porque por que não?). Neste caso --
é muito útil; este é um comando muito mais robusto:
cat -- "$file"