2011-01-10 7 views
28

so come eseguire script bash a distanza, tramite queste sintassi:passaggio di parametri per colpire durante l'esecuzione di uno script prelevato dal ricciolo

curl http://foo.com/script.sh | bash 

o

bash < <(curl http://foo.com/script.sh) 

che danno lo stesso risultato.

E se fosse necessario passare argomenti allo script di bash? E 'possibile quando lo script viene salvato a livello locale:

./script.sh argument1 argument2 

Ho provato diverse possibilità come questa, senza successo:

bash < <(curl http://foo.com/script.sh) argument1 argument2 

risposta

54

provare

curl http://foo.com/script.sh | bash -s arg1 arg2 

manuale bash dice:

Se l'opzione -s è presente, o se nessun argomento rema dopo l'elaborazione dell'opzione, i comandi vengono letti dallo standard input. Questa opzione consente di impostare i parametri posizionali quando si richiama una shell interattiva.

+3

Grazie! Estremamente utile con gli elementi :) –

+1

Non funziona se arg1 è un breve argomento: curl http://foo.com/script.sh | bash -s -y – Xorax

+1

E i parametri che usano chiavi come '-p blah -d blah'? – CMCDragonkai

13

Altre alternative:

curl http://foo.com/script.sh | bash /dev/stdin arguments 
bash <(curl http://foo.com/script.sh) arguments 
+2

Tutti i metodi differiscono sull'argomento $ 0. Per "-s" è "bash", per "/ dev/stdin" è "/ dev/stdin" e "<(...)" fornisce l'argomento $ 0 come "/ dev/fd/63". – jinowolski

+0

La prima alternativa funziona con argomenti di script che iniziano con '-', cioè le opzioni –

+0

Si prega di fornire un esempio per un argomento per farmi conoscere il formato –

37

di migliorare jinowolski's answer un po ', si dovrebbe usare:

curl http://example.com/script.sh | bash -s -- arg1 arg2 

Nota i due trattini (-), che stanno dicendo bash di non processare nulla seguendolo come argomenti per bash.

questo modo che possa funzionare con qualsiasi tipo di argomenti, ad esempio:

curl -L http://bootstrap.saltstack.org | bash -s -- -M -N stable 

Questa volontà del lavoro del corso con qualsiasi tipo di input tramite stdin, non solo ricciolo, in modo da poter confermare che funziona con semplici ingresso script bash via eco:

echo 'i=1; for a in [email protected]; do echo "$i = $a"; i=$((i+1)); done' | \ 
bash -s -- -a1 -a2 -a3 --long some_text 

vi darà l'uscita

1 = -a1 
2 = -a2 
3 = -a3 
4 = --long 
5 = some_text 
+1

Un suggerimento eccellente e molto chiaro sul motivo per cui dovresti farlo. – shrikeh

+0

Grazie per la chiara spiegazione. Questo trucco è davvero utile! – agate

Problemi correlati