Como o comando para instalar o RVM funciona?

2

Uma pergunta para iniciantes. Eu estava instalando o RVM (uma ferramenta para gerenciar Ruby versões). O comando para isso é:

bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )

Eu sei um pouco que < é um operador de redirecionamento de comandos (correto?).

Então, por que o segundo < é necessário (o que ele faz)?

    
por Zabba 25.11.2010 / 08:46

2 respostas

5

Ele transforma uma string no descritor de arquivo para a saída do script bash que ele representa. Isso pode ser confuso, aqui está um exemplo

se você digitar echo <(ls) , ele abrirá um novo descritor de arquivo, cujo nome será substituído. Então o comando pode se transformar em echo /dev/fd/63 .

Um programa que espera um arquivo pode agora ler a saída do comando sem ter que aceitar stdin.

$ my_program ls
Error: 'ls': No such file or directory.
$ my_program <(ls)
my_program was called with the argument /dev/fd/63
bin dev etc ...

Muitos programas Linux, se não forem fornecidos com uma fonte de entrada, aguardam entrada padrão. Como a saída padrão pode ser canalizada para a entrada padrão com o operador "|", você pode usar, digamos, ls | grep hello . Isso só funciona porque o grep teria esperado pela entrada, se ele esperasse que um nome de arquivo fosse aberto e lido para obter seus dados, o operador de pipe não funcionaria. É por isso que você precisa & lt; (...).

Espero que isso seja inteligível. : -)

Juntamente com o & lt; operador para redirecionar a saída de um arquivo para uma leitura de programas de stdin, isso faz para o seguinte significado :

Bash: leia a saída deste arquivo, que é criado a partir da saída deste comando.

Esclarecimentos:

  • entrada padrão: um "arquivo" (não realmente, mas no linux tudo funciona como um arquivo) que, quando lido, contém magicamente o que você digitou
  • saída padrão: um "arquivo" que, quando gravado, será impresso no terminal virtual
  • operador (ou seja, < ou <() ): O mesmo que nas matemáticas regulares, as expressões de operadores e operandos serão avaliadas e substituídas. 3 + 2 * 3 se transforma em 5 * 3 se transforma em 15. É o mesmo na linguagem bash.

Um bom exemplo para enfatizar o ponto de Roger é esta expressão:

if [ -f my_condition ] then something fi

Aqui, o conteúdo dos colchetes será avaliado como uma instrução condicional, ou seja, se my_condition for true, faça alguma coisa. Mas: [ é na verdade apenas um alias do programa test , que, quando chamado com o parâmetro -f, irá verificar se existe um arquivo.

    
por Stefano Palazzo 25.11.2010 / 10:13
2

Para esclarecer o ponto de Stefano, o segundo & lt; não é apenas um & lt ;, na verdade é & lt; ()

Você pode já estar familiarizado com uma construção similar, $ (), que produz uma string que é o resultado do comando dentro dela. Então:

$ which bash # echo the path to bash
/bin/bash
$ ldd $(which bash) # return which libraries bash is linked to
...

Após a substituição da string, isso é equivalente a

ldd /bin/bash

Como Stefano diz, & lt; () faz uma coisa muito semelhante, mas em vez disso, retorna um descritor de arquivo.

Você pode encontrar a documentação bash em man bash . Como é uma página man enorme, você pode pesquisar (pressione / ) para <\( (você precisa escapar do colchete aberto - procurar por <( não funcionará).

    
por Roger Light 25.11.2010 / 10:24