Bashはパイプからスクリプトを実行できます。最小限の例は次のとおりです。
> echo "echo hello world" | bash
hello world
curl
またはからダウンロードしたスクリプトを実行したい場合は便利ですwget
。
read
しかし、明らかにこの種のスクリプトの実行には使用できません。例えば、
#!/bin/bash
echo 'input: '
read HELLO
echo hello: $HELLO
bashスクリプトファイルで上記のスクリプトを実行すると$HELLO
。echo hello: $HELLO
前述のようにスクリプトを提供する場合:
> echo "echo 'input: '; read HELLO; echo hello: $HELLO" | bash
input:
hello:
まったく相互作用が得られません。まだ$HELLO
空です。また、bashにオプションを追加しようとしましたが、-i
成功しませんでした。
read
パイプラインスクリプトで使用できる方法はありますか?どのように?それともできないとしたら、なぜですか?
答え1
read
stdin(読み取り場所)と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)
スクリプトを検出するためにスクリプトを使用する必要がある場合、誰も感謝しません。