Como o '-' funciona no redirecionamento do bash?

1

Eu já vi isso explicado em algum lugar antes, mas não consigo encontrar uma referência agora. Um exemplo de uso do guia de introdução do docker para o Ubuntu:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Eu até me lembro muito vagamente do que é suposto fazer. IIRC corretamente, é suposto que de alguma forma usar o stdin passou pelo tubo. Mas por que isso é necessário neste caso?

O mais próximo que cheguei de encontrar algo sobre isso foi neste artigo: link . Talvez, esteja relacionado ao fechamento de um fluxo, como no exemplo em que você abre um fluxo não padrão e depois o fecha?

exec 3<file
exec 3>&-
    
por Brian Peterson 16.01.2018 / 00:36

2 respostas

3

Não é um recurso do Bash, ou qualquer shell, mas uma convenção em muitos aplicativos para explicitamente dizer a eles para lerem de stdin . É claro que muitos programas leem stdin se nenhum outro arquivo for mencionado, mas mesmo nesse caso, você precisa ser capaz de especificar explicitamente stdin se quiser que ele seja processado junto com outros arquivos. Por exemplo, cat foo - para que cat leia o arquivo foo e stdin .

No caso de apt-key , a página de manual implica que dar um nome de arquivo para o subcomando add é obrigatório e que - deve ser especificado para usar stdin . Lembre-se de que cabe ao aplicativo fazer o que quiser e ler qualquer entrada que desejar; Não há nada que requeira que algum programa leia stdin . Usá-lo como a fonte padrão para entrada é apenas um costume.

Alguns programas não suportam - como significando stdin , mas aceitam como um nome de arquivo literal. Nesses casos, soluções alternativas como /dev/stdin são necessárias.

Quanto a >&- , não consigo ver que eles seriam explicitamente conectados. Provavelmente é apenas um uso um tanto quanto coincidente de um personagem simples. Em >&- , o traço provavelmente vem de uma conexão com um ataque que significa "nada", um campo vazio. Por que é usado para significar stdin , não sei. Mas parece melhor do que % ou algo assim, e vários outros personagens têm outros significados.

    
por 16.01.2018 / 00:40
1

O - é um argumento que normalmente (para alguns comandos) significa "a entrada stdin".

Então, este pipe de comando (dois comandos separados por | ):

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

use o - para dizer ao apt-key para ler o stdin.

Essa entrada (stdin) é aquela que vem do pipe. A saída de onda.

    
por 16.01.2018 / 00:41