2012-04-01 14 views
9

Supponiamo che io sono uno script: my_script.shEseguire uno script in filodiffusione dallo standard input (Linux/Shell Scripting)

Invece di fare

./my_script.sh 

voglio fare qualcosa di simile:

cat my_script.sh | <some command here> 

tale che lo script venga eseguito. È possibile?

Il caso d'uso è se lo script che voglio eseguire è l'output di un wget o s3cat, ecc. In questo momento lo salvo in un file temporaneo, lo cambi in eseguibile, e poi lo eseguo. C'è un modo per farlo direttamente?

+1

Bisogna stare molto attenti a fare questo. Se qualcosa all'interno del tuo script legge da stdin (ad esempio, qualsiasi comando che richiede all'utente "Sì/No"), consumerà le linee * dal tuo script *, e quelle linee non verranno eseguite. –

risposta

15

Basta pipe alla vostra shell preferita, per esempio:

$ cat my_script.sh 
set -x 
echo hello 
$ cat my_script.sh | sh 
+ echo hello 
hello 

(Il set -x rende il guscio stampare ogni affermazione che sta per finire, prima che lo gestisce, a portata di mano per il debugging, ma non ha nulla . a che fare con il problema specifico - lì solo per scopi dimostrativi)

+0

poiché questa risposta è per qualcuno che non ha familiarità con bash, la tua risposta sarebbe meglio se spiegassi cosa compie la parte 'set -x' del comando e se sia parte integrante della soluzione o solo un esempio dei tipi di cose tu puoi fare. –

+0

Chiarito. (Niente di specifico qui, 'set -x' dovrebbe essere disponibile in tutte le shell POSIX.) – Mat

+1

se lo script specifica il tipo di shell con" #! " roba, allora questo ha la precedenza su qualunque shell lo canalizzi? – Switch

3

si potrebbe usare:

cat my_script.sh | xargs -i <some_command> {} 

o:

cat my_script.sh | bash - 
1

RVM raccomanda questo metodo per run their installer:

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