「read」を使用してスクリプトをパイピングしてbashする


10

私はそれを通すことによって、スクリプトを実行する必要がある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:を表示して値を要求する代わりに、読み取りコマンドはによって渡されbashます。

誰もが知っているどのように私ができるパイプでスクリプトreadbash

回答:


16

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

素晴らしいです、ありがとう。これはほとんど同じです。
Robin Winslow

2

プロセス置換はあなたが望むことをします:

bash <(wget ...)

とはいえ、ここであなたの動機について質問しなければなりません。Webサーバーを制御している場合(およびhttpsを使用している場合)、おそらくこれは理にかなっています。ただし、インターネットブラインドからスクリプトを実行するだけでは非常に危険です。


just running a script from the internet blind is very risky-はい、それは危険だと知っていますが、人々は特定の組織のスクリプトを信頼することを選択できます。@ Xen2050の回答に関するコメントの議論を参照してください。
Robin Winslow

1

に問題があります:

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


'cos次に、ファイルを作成する必要があります。私はそれがうまくいくことを意味します、それは少し厄介です。
Robin Winslow

1
そうだね。それがを使用する正当な理由ですが/tmp、多くのプログラムが一時ファイルを使用します。ダウンロードしたスクリプトを最初に確認せずにすぐに実行することに
うんざりし

まあそれはあなたの呼び出しです。Dockerohmyzshなど、現時点では思い出せないプロジェクトが数多くあります。この場合は、自分のリポジトリから新しいシステムで実行したいセットアップスクリプトです。書いたので中身はあまり気になりません。
Robin Winslow

3
私はこの質問を見つけた他の誰か(おそらくまったく新しいユーザー)がそれ以上のことを知らないかもしれないと考えています。
Xen2050、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.