Canalizando um script com "read" para bash


10

Eu preciso executar um script, canalizando-o através bashde wget(em vez de executá-lo diretamente com bash).

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

Não está funcionando porque meu script possui readinstruções. Por alguma razão, eles não funcionam ao canalizar para o 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 bash.

Alguém sabe como eu posso canalizar um script readpara bash?

Respostas:


16

readlê da entrada padrão. Mas a entrada padrão do processo bash já é aceita pelo script. Dependendo do shell, readele não lê nada, porque o shell já leu e analisou o script inteiro ou readconsumirá 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

Agradecimentos impressionantes. Isso é quase tão elegante.
Robin Winslow

2

A substituição do processo fará o que você deseja:

bash <(wget ...)

Dito isto, tenho que questionar sua motivação aqui. Se você controla o servidor da web (e usa https), talvez isso faça sentido. Mas apenas executar um script a partir da Internet é muito arriscado.


just running a script from the internet blind is very risky- sim, sabemos que é arriscado, mas as pessoas podem optar por confiar em scripts de certas organizações. Veja a discussão nos comentários da resposta do @ Xen2050.
Robin Winslow

1

Existe algo errado com:

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

?


Porque então eu tenho que criar um arquivo. Quero dizer que funcionaria, é um pouco bagunçado.
Robin Winslow

1
Verdadeiro. Embora seja uma boa razão para usar /tmp, muitos programas usam arquivos temporários. Eu seria Leary de executar quaisquer scripts baixado imediatamente sem dar uma olhada primeiro ...
Xen2050

Bem, essa é a sua decisão. Muitos projetos oferecem esses recursos, como Docker , ohmyzsh e outros dos quais não me lembro agora. Nesse caso, é um script de instalação que desejo executar em novos sistemas a partir do meu próprio repositório. Não estou muito preocupado com o conteúdo, como escrevi.
Robin Winslow

3
Estou pensando em alguém que encontrar essa pergunta (talvez um usuário totalmente novo) talvez não conheça melhor.
Xen2050
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.