Piping di uno script con "read" per bash


10

Ho bisogno di eseguire uno script eseguendo il piping bashcon wget(anziché eseguirlo direttamente con bash).

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

Non funziona perché la mia sceneggiatura contiene delle readdichiarazioni. Per qualche motivo questi non funzionano quando si esegue il piping per 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
$

Invece di richiedere input:e chiedere un valore come dovrebbe, il comando read viene semplicemente passato bash.

Qualcuno sa come posso tubo di uno script con reada bash?

Risposte:


16

readlegge dallo standard input. Ma l'input standard del processo bash è già preso dallo script. A seconda della shell, o readnon leggerà nulla perché la shell ha già letto e analizzato l'intero script o readconsumerà righe imprevedibili nello script.

Soluzione semplice:

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

Soluzione più complessa, più per scopi educativi che per illustrare una buona soluzione per questo particolare scenario:

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

Grazie eccezionale. Questo è quasi altrettanto elegante.
Robin Winslow,

2

La sostituzione del processo farà ciò che desideri:

bash <(wget ...)

Detto questo, devo mettere in discussione la tua motivazione qui. Se controlli il server web (e usi https), forse questo potrebbe avere senso. Ma eseguire una sceneggiatura da Internet non vedente è molto rischioso.


just running a script from the internet blind is very risky- sì, sappiamo che è rischioso, ma le persone possono scegliere di fidarsi degli script di determinate organizzazioni. Vedi la discussione nei commenti sulla risposta di @ Xen2050.
Robin Winslow,

1

C'è qualcosa di sbagliato in:

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

?


quindi allora devo creare un file. Voglio dire, funzionerebbe, è solo un po 'disordinato.
Robin Winslow,

1
Vero. Anche se questo è un buon motivo per usarlo /tmp, molti programmi usano file temporanei. Sarei impaurito di eseguire immediatamente qualsiasi script scaricato senza dare un'occhiata prima ...
Xen2050

Bene, questa è la tua chiamata. Numerosi progetti offrono queste linee guida, ad esempio Docker , ohmyzsh e altri che non riesco a ricordare in questo momento. In questo caso è uno script di installazione che voglio eseguire su nuovi sistemi dal mio repository. Non sono troppo preoccupato per il suo contenuto, come l'ho scritto.
Robin Winslow,

3
Sto pensando che chiunque abbia trovato questa domanda (forse un utente totalmente nuovo) potrebbe non conoscerlo meglio.
Xen2050,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.