bashの「読み取り」パイピングスクリプト

bashの「読み取り」パイピングスクリプト

bashbashを使用して直接実行するのではなく、パイプを介してスクリプトを実行する必要があります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

関連情報