bash
でwget
を介してスクリプトを実行し、スクリプトを実行する必要があります(bashで直接実行するのではなく)。
$ wget -O - http://example.com/my-script.sh | bash
スクリプトにread
ステートメントが含まれているため、機能しません。何らかの理由で、bashにパイプするときにこれらは機能しません。
# Piping to bash works in general
$ echo 'hi'
hi
$ echo "echo 'hi'" | bash
hi
# `read` works directly
$ read -p "input: " var
input: <Prompt>
# But not when piping - returns immediately
$ echo 'read -p "input: " var' | bash
$
input:
を使用して値を要求すると、readコマンドはbash
によって渡されます。
read
を使用してスクリプトをbash
にパイプ処理する方法を知っている人はいますか?
read
は標準入力から読み取ります。しかし、bashプロセスの標準入力は既にスクリプトによって取得されています。シェルによっては、read
は何も読み取れません。これは、シェルがすでにスクリプト全体を読み取って解析しているためです。または、read
はスクリプト内の予測できない行を消費します。
シンプルなソリューション:
bash -c "$(wget -O - http://example.com/my-script.sh)"
この特定のシナリオに適したソリューションを説明するよりも、教育目的のためのより複雑なソリューション:
echo '{ exec </dev/tty; wget -O - http://example.com/my-script.sh; }' | bash
プロセス置換はあなたが望むことをします:
bash <(wget ...)
とはいえ、ここであなたの動機を疑わなければなりません。 Webサーバーを制御している場合(そしてhttpsを使用している場合)、おそらくこれは理にかなっています。ただし、インターネットブラインドからスクリプトを実行するだけでは非常に危険です。
に問題があります:
wget -O tmpscript.sh http://example.com/my-script.sh
chmod +x tmpscript.sh
tmpscript.sh
?