Eu sei desta resposta SO que traços nus são usados por vários utilitários Unix para especificar que o usuário deseja usar stdin ou stdout em vez de um arquivo regular.
No entanto, isso não me ajuda muito a entender a sintaxe do seguinte (que tirei de um buildpack do Heroku que basicamente instala uma cópia do Perl em um diretório). No geral, o que está acontecendo é que o Perl está sendo baixado de um URL em $PERL_PACKAGE e canalizado para tar, que o extrai para o diretório $VENDORED_PERL
curl $PERL_PACKAGE -s -o - | tar xzf - -C $VENDORED_PERL
Mas os detalhes são meio confusos. -o é usado quando você deseja especificar um arquivo para saída em vez de stdout, então não vejo por que você usaria essa opção e depois um traço, em vez de simplesmente não usar a opção.
Quanto ao tar, eu acho - está dizendo para não usar um arquivo de entrada, pois está recebendo a entrada de um pipe?
Talvez eu esteja perdendo alguns dos requisitos de como os tubos funcionam.
Acho que não está faltando nada. As opções que você mencionou são desnecessárias em todos os shells
curl
etar
implementações que usei nos últimos anos.Eu escreveria essa linha assim:
Ou seja, sem as opções de nome de arquivo desnecessárias e com aspas duplas conservadoras das variáveis usadas como argumentos de linha de comando.
Por que eles escreveram da maneira que escreveram? Podem ser velhos hábitos. Ou alguns sistemas antigos, implementações antigas onde esses parâmetros costumavam ser necessários. E como o script funciona como está, não há nada para "consertar".
f -
significa "ler de stdin" / "escrever em stdout" comtar
, também. Mas a origem/destino padrão pode variar entretar
versões e implementações, portanto, parece mais seguro adicioná-lo ao comando.Se
-o -
não for necessáriocurl
, talvez o autor desse comando não soubesse disso ou pensasse que o comando era mais fácil de entender com essa informação explícita.