web-dev-qa-db-ja.com

bashへの「読み取り」を使用してスクリプトをパイプする

bashwgetを介してスクリプトを実行し、スクリプトを実行する必要があります(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にパイプ処理する方法を知っている人はいますか?

10
Robin Winslow

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を使用している場合)、おそらくこれは理にかなっています。ただし、インターネットブラインドからスクリプトを実行するだけでは非常に危険です。

2
Lexelby

に問題があります:

wget -O tmpscript.sh http://example.com/my-script.sh
chmod +x tmpscript.sh
tmpscript.sh

1
Xen2050