Em este tutorial que precisamos para executar o seguinte comando:
# curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -
O que significa o último -
(hífen) depois bash
?
Eu já vi muitos comandos com isso, e não consegui encontrar uma explicação lógica nem descobrir como reformular uma pesquisa no Google. É a saída do comando canalizado?
linux
command-line
bash
pipe
Omar BISTAMI
fonte
fonte
sudo bash
sons realmente assustadores. Tente procurar um tutorial que não incentive essas práticas.symbolhound.com
.Respostas:
O Bash se comporta de maneira um pouco fora do padrão
-
.O POSIX diz:
E
Mas então
man 1 bash
lê:Portanto, para Bash
-
não significa entrada padrão nem arquivo, portanto, algo fora do padrão.Agora seu caso particular:
Eu suspeito que o autor deste comando pode não perceber que
-
é equivalente a--
neste caso. Eu suspeito que o autor queria ter certezabash
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 porquebash
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:Deixe um arquivo chamado
--help
existir. Isso não imprimirá o arquivo:Mas isso imprimirá o arquivo chamado
--help
:Isso concatenará o arquivo nomeado
--help
com o que vier da entrada padrão:Parece que você realmente não precisa
--
, porque você sempre pode passar o./--help
que será interpretado como um arquivo, com certeza. Mas considerequando 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:fonte
Em
man bash
, no final das opções de um caractere, há: -Se você citou o comando completo, não vejo motivo para usá-lo
-
posteriormentebash
, mas não faz mal.fonte
-
, um requisito improvável, mas-
/--
torna possível.cat file1 - file2 > file3
.bash -
significa quebash
está esperando por stdin. Portanto, praticamente o bash executará o que for retornado pelo comando que está à esquerda de|
Um exemplo semelhante, porém mais fácil, seria:
echo hello | cat -
aqui,cat
imprimirá 'olá'. Por quê? Porque 'olá' está sendo enviado para o gato|
ecat
está esperando por qualquer coisa enviada a eleAgora vamos dividir o comando inteiro em dois:
este comando curl retornará algo que pode ser entendido e executado pelo bash
então nós temos um pipe
|
que enviará a saída retornada pelo comando curl para o lado direito do pipe iesudo -E bash -
. Finalmentesudo -E bash -
, o bash está pronto para executar qualquer coisa que é enviada a elefonte