O que significa um redirecionamento "<<(...)"?

32

Eu vi que o rvm (ruby version manager) é instalado usando o seguinte comando:

bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )

Então, pelo que entendi, obtemos o conteúdo do script e o passamos para o bash (acredito < <e <<é a mesma coisa?) Estou interessado na < <parte, encontrada a seguinte descrição na rede:

<< token Significa usar o fluxo de entrada atual como STDIN para o programa até que o token seja visto.

De alguma forma, isso não está claro para mim, alguém pode dar um exemplo ou explicá-lo de maneira mais simples?

Stonerain
fonte

Respostas:

40

Não, < <e <<não são a mesma coisa.

O primeiro é composto pelo <caractere de redirecionamento comum combinado com o primeiro caractere da <(command)sintaxe. Essa é uma kshconstrução (também encontrada em bashe zsh) conhecida como substituição de processo que pega a saída commande a fornece em um arquivo cujo nome se refere à outra extremidade do canal para a qual commandestá gravando.

Em outras palavras, você pode pensar < <(command)como < file, onde o arquivo contém a saída de command.

enzotib
fonte
5
Eu aprendi sobre esse comando há alguns dias atrás, é um comando muito útil. As coisas que você pode fazer com isso são limitadas apenas pela sua imaginação: por exemplo, este comando fornece uma lista de apenas arquivos ocultos:diff <(ls) <(ls -a)
Khaja Minhajuddin
1
Essa sintaxe pode realmente ser bastante útil, mas no caso específico de Stonerain, ela parece não fornecer nenhum valor agregado em comparação com um simples canal.
Jlliagre
1
Na sintaxe acima, isso não ajuda. Mas se você mudar um pouco, é muito melhor: em bash <(curl ...)vez de bash < <(curl ...)não roubar STDIN, você estará livre para responder às solicitações e fornecer informações no script.
precisa saber é o seguinte
Usar <() parece ser uma ótima alternativa para enviar várias variáveis ​​$ diretamente para comandos, em vez de precisar desnecessariamente gravar as variáveis ​​$ nos arquivos primeiro. diff <(eco "$ text1") <(echo "$ text2") stackoverflow.com/questions/13437104/…
Sepero 6/12/12
18

É uma maneira complicada de fazer o mais simples:

curl -s https://raw.github.com/... | bash
jlliagre
fonte