web-dev-qa-db-ja.com

curlによってフェッチされたスクリプトを実行するときにパラメーターをbashに渡す

これらの構文を使用して、リモートbashスクリプトを実行する方法を知っています。

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

または

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

同じ結果が得られます。

しかし、bashスクリプトに引数を渡す必要がある場合はどうなりますか?スクリプトがローカルに保存されている場合、次のことが可能です。

./script.sh argument1 argument2

私はこのようないくつかの可能性を試しましたが、成功しませんでした:

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

試す

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

bashマニュアルによると:

-sオプションが存在する場合、またはオプションの処理後に引数が残っていない場合、コマンドは標準入力から読み取られます。このオプションを使用すると、インタラクティブシェルを呼び出すときに位置パラメータを設定できます。

69
jinowolski

jinowolskiの答え を少し改善するには、次を使用する必要があります。

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

2つのダッシュ(-)は、bashの引数としてそれに続くものを処理しないようにbashに指示していることに注意してください。

このように、それはあらゆる種類の引数で動作します、例えば:

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

これはもちろん、curlだけでなくstdinを介したあらゆる種類の入力で機能するため、echoを介した単純なBASHスクリプト入力で機能することを確認できます。

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

あなたに出力を与えます

1 = -a1
2 = -a2
3 = -a3
4 = --long
5 = some_text
61
Janne Enberg

その他の選択肢:

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