Há uma diferença prática.
curl -sSL https://get.docker.com/ | sh
inicia curl
e sh
, ao mesmo tempo, conecta a saída de curl
com a entrada de sh
. curl
realizará o download (aproximadamente) o mais rápido que sh
puder executar o script. O servidor pode detectar irregularidades no tempo e injetar código malicioso não visível ao simplesmente fazer o download do recurso em um arquivo ou buffer ou ao visualizá-lo em um navegador.
Em sh -c "$(curl -sSL https://get.docker.com/)"
, curl
é executado estritamente antes da sh
execução. Todo o conteúdo do recurso é baixado e passado para o seu shell antes do sh
início. Seu shell só inicia sh
quando curl
sai e passa o texto do recurso para ele. O servidor não pode detectar a sh
chamada; só é iniciado depois que a conexão termina. É semelhante ao download do script em um arquivo primeiro.
(Isso pode não ser relevante no caso da janela de encaixe, mas pode ser um problema em geral e destaca uma diferença prática entre os dois comandos.)
vulnerable to server-side detection
frase. Isso leva a uma postagem no blog que explica detalhadamente como eles são alcançados. TL; DR: coloque um sono em seu script e observe o atraso na recepção no servidor.Eu acredito que eles são praticamente idênticos. No entanto, existem casos raros em que são diferentes.
$(cmd)
é substituído pelos resultados decmd
. Se o comprimento desse comando de resultado exceder o valor máximo do tamanho do argumento retornado porgetconf ARG_MAX
, ele truncará o resultado, o que pode resultar em resultados imprevisíveis.A opção de tubulação não possui essa limitação. Cada linha de saída do
curl
comando será executadabash
quando chegar do pipe.Mas ARG_MAX geralmente está no intervalo de 256.000 caracteres. Para uma instalação do docker, eu ficaria confiante usando qualquer um dos métodos. :-)
fonte
ARG_MAX
, o bash limita um argumento individual a 131072 bytes no meu sistema, quando égetconf ARG_MAX
impresso2097152
. Mas de qualquer maneira, erro ou truncamento, não funcionaria.Em
curl -sSL https://get.docker.com/ | sh
:Ambos os comandos
curl
esh
começarão ao mesmo tempo nos respectivos subshellsO STDOUT de
curl
será passado como o STDIN parash
(é isso que pipe|
, faz)Considerando que
sh -c "$(curl -sSL https://get.docker.com/)"
:A substituição do comando,,
$()
será executada primeiro, isto écurl
, será executada primeiro em um subshellA substituição do comando,,
$()
será substituída pelo STDOUT decurl
sh -c
(shell não interativo e sem login) executará o STDOUT decurl
fonte
Uma diferença entre as duas (extraídas de outras respostas da Web) é que, se você não baixar o script inteiro de uma só vez, ele pode interromper o processo em um ponto desconhecido e alterar o significado do comando. executado. Portanto, parece primeiro fazer o download do arquivo inteiro e depois avaliar se seria melhor.
fonte