Piping um script com “read” para bash

9

Eu preciso executar um script passando-o por bash com wget (em vez de executá-lo diretamente com o bash).

$ wget -O - http://example.com/my-script.sh | bash

Não está funcionando porque meu script tem read declarações nele. Por alguma razão, isso não funciona quando se fala de bash:

# Piping to bash works in general
$ echo 'hi'
hi
$ echo "echo 'hi'" | bash
hi

# 'read' works directly
$ read -p "input: " var
input: <prompt>

# But not when piping - returns immediately
$ echo 'read -p "input: " var' | bash
$

Em vez de solicitar input: e pedir um valor como deveria, o comando read é ignorado por bash .

Alguém sabe como posso canalizar um script com read para bash ?

    
por Robin Winslow 22.01.2015 / 01:18

3 respostas

14

read lê a entrada padrão. Mas a entrada padrão do processo bash já foi tomada pelo script. Dependendo do shell, read não lerá nada porque o shell já leu e analisou todo o script ou read consumirá linhas imprevisíveis no script.

Solução simples:

bash -c "$(wget -O - http://example.com/my-script.sh)"

Solução mais complexa, mais para fins educacionais do que para ilustrar uma boa solução para esse cenário específico:

echo '{ exec </dev/tty; wget -O - http://example.com/my-script.sh; }' | bash
    
por 22.01.2015 / 01:27
2

A substituição de processos fará o que você deseja:

bash <(wget ...)

Dito isso, tenho que questionar sua motivação aqui. Se você controlar o servidor da Web (e usar https), talvez isso faça sentido. Mas apenas executar um script da internet é muito arriscado.

    
por 24.01.2015 / 16:57
1

Há algo errado com:

wget -O tmpscript.sh http://example.com/my-script.sh
chmod +x tmpscript.sh
tmpscript.sh

?

    
por 22.01.2015 / 01:27