bash
bashを使用して直接実行するのではなく、パイプを介してスクリプトを実行する必要がありますwget
。
$ 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:
、値を求めるメッセージを表示せずに直接渡されますbash
。
read
スクリプトをパイプする方法を知っている人はいますかbash
?
答え1
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
答え2
プロセス置換は所望のタスクを実行する。
bash <(wget ...)
つまり、私はあなたの動機について疑問を提起する必要があります。 Webサーバーを制御してhttpsを使用している場合、これは意味がある可能性があります。しかし、インターネット上でランダムなスクリプトを実行することは非常に危険です。
答え3
質問:
wget -O tmpscript.sh http://example.com/my-script.sh
chmod +x tmpscript.sh
tmpscript.sh
?