przekazywanie parametrów do bash podczas wykonywania skryptu pobieranego przez curl

Wiem jak wykonać zdalny skrypt bash, za pomocą tych składni:

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

Lub

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

Które dają ten sam wynik.

Ale co jeśli muszę przekazać argumenty do skryptu bash ? Jest to możliwe, gdy skrypt jest zapisywany lokalnie:

./script.sh argument1 argument2

Wypróbowałem kilka możliwości takich jak ta, bez powodzenia:

bash < <( curl http://foo.com/script.sh ) argument1 argument2
Author: Daniel R, 2011-01-10

3 answers

Try

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

Instrukcja Bash mówi:

Jeśli istnieje opcja-s lub jeśli po przetworzeniu opcji nie pozostały żadne argumenty, to polecenia są odczytywane ze standardowego wejścia. Opcja ta umożliwia ustawienie parametrów pozycyjnych podczas wywoływania interaktywnej powłoki.

 58
Author: jinowolski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-10 01:19:47

Aby poprawić odpowiedź jinowolskiego trochę, powinieneś użyć:

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

Zwróć uwagę na dwa myślniki ( -- ), które mówią bashowi, aby nie przetwarzał niczego po nim jako argumentów do Basha.

W ten sposób będzie działać z dowolnymi argumentami, np.:

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

Będzie to oczywiście działać z każdym rodzajem wprowadzania przez stdin, a nie tylko curl, więc możesz potwierdzić, że działa z prostym skryptem BASH wprowadzanym przez echo:

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

Da ci wyjście

1 = -a1
2 = -a2
3 = -a3
4 = --long
5 = some_text
 44
Author: Janne Enberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-29 07:11:17

Inne alternatywy:

curl http://foo.com/script.sh | bash /dev/stdin arguments
bash <( curl http://foo.com/script.sh ) arguments
 13
Author: ephemient,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-10 01:20:32