Bashスクリプトのパイプで「読み取り」を使用する

Bashスクリプトのパイプで「読み取り」を使用する

Bashはパイプからスクリプトを実行できます。最小限の例は次のとおりです。

> echo "echo hello world" | bash
hello world

curlまたはからダウンロードしたスクリプトを実行したい場合は便利ですwget

readしかし、明らかにこの種のスクリプトの実行には使用できません。例えば、

#!/bin/bash

echo 'input: '
read HELLO
echo hello: $HELLO

bashスクリプトファイルで上記のスクリプトを実行すると$HELLOecho hello: $HELLO

前述のようにスクリプトを提供する場合:

> echo "echo 'input: '; read HELLO; echo hello: $HELLO" | bash
input: 
hello:

まったく相互作用が得られません。まだ$HELLO空です。また、bashにオプションを追加しようとしましたが、-i成功しませんでした。

readパイプラインスクリプトで使用できる方法はありますか?どのように?それともできないとしたら、なぜですか?

答え1

readstdin(読み取り場所)とstderr(-p存在する場合はプロンプトを印刷する場所)を介してユーザーと「相互作用」します。

標準入力スクリプトread内容を取得するので、1行をスキップします。

$ echo '
read foo
what the -)(*$;?
echo "$foo"
' | bash
what the -)(*$;?

これは良い習慣ではなく、すべてのシェルで機能するわけではありません。また、標準入力を介してスクリプトをパイプするときは、bashバイト単位で読み取る必要があります。

あなたの例では、スクリプト全体は1行なので、read組み込み関数はEOFのみを取得し、変数を設定しません。

read制御ttyから常に読み取るには、明示的にリダイレクトします。

read var </dev/tty

これも注意して使用する必要があります。expect(1)スクリプトを検出するためにスクリプトを使用する必要がある場合、誰も感謝しません。

関連情報