2011-01-10 13 views
28

wiem jak wykonać zdalny skrypt bash, za pośrednictwem tych składni:przekazywania parametrów do bash podczas wykonywania skryptu naciągane przez zwinięcie

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

lub

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

które dają ten sam rezultat.

Ale co, jeśli muszę przekazać argumenty do skryptu Bash? Jest to możliwe, gdy skrypt zostanie zapisany lokalnie:

./script.sh argument1 argument2 

Próbowałem kilka możliwości jak ten, bez powodzenia:

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

Odpowiedz

54

spróbować

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

bash podręcznik mówi:

Jeśli dostępna jest opcja -s lub brak argumentów rema w przetwarzaniu opcji po, polecenia są odczytywane ze standardowego wejścia. Ta opcja umożliwia ustawienie parametrów pozycyjnych podczas wywoływania powłoki interaktywnej.

+3

Dzięki! Niezwykle przydatny w majach :) –

+1

Nie działa, jeśli arg1 to krótki arg: curl http://foo.com/script.sh | bash -s -y – Xorax

+1

Co z parametrami, które używają klawiszy takich jak '-p blah -d blah'? – CMCDragonkai

13

Inne alternatywy:

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

Wszystkie metody różnią się argumentem 0 USD. Dla "-s" jest to "bash", dla "/ dev/stdin" jest to "/ dev/stdin" i "<(...)" daje argument $ 0 jak "/ dev/fd/63". – jinowolski

+0

Pierwsza alternatywa działa z argumentami skryptowymi zaczynającymi się od '-', czyli opcjami –

+0

Podaj przykład argumentu, aby poinformować mnie o formacie –

37

poprawić jinowolski's answer kawałek, należy użyć:

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

zauważy dwie kreski (-), które mówią bash do niczego nie przetwarza podążając za nim jako argumentem dla basha.

ten sposób to będzie działać z każdym rodzajem argumentów, np:

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

Będzie to oczywiście pracy z wszelkiego rodzaju wejścia poprzez standardowego wejścia, a nie tylko curl, można więc potwierdzić, że działa z prostym BASH wejście skrypt poprzez echo:

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

daje wyświetlamy

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

Doskonała sugestia i bardzo jasne, dlaczego powinieneś to zrobić. – shrikeh

+0

Dzięki za jasne wyjaśnienie. Ta sztuczka jest naprawdę przydatna! – agate

Powiązane problemy