次のシェルスクリプトを考えてみましょう。
echo foo; read; echo bar
出力「foo」を実行し、bash my_script
戻りキーを待ってから「bar」を出力します。
この方法で実行すると正常に動作しますが、/bin/bash にパイプすると動作しなくなります。
$ echo 'echo foo;read;echo bar'|bash
キーを押すのを待たずに「foo」と「bar」を直接出力します。
このように使用すると、なぜもう機能しませんか?
ファイルスクリプトファイルと/ bin / bashにパイプされたスクリプト文字列形式でスクリプトを再構築する方法はありますか?
ベストアンサー1
実際にはとても簡単です。まず、記憶された記述子に標準入力を維持する必要があります。
exec 9<&0
そこに。コピーを作成しました。それでは、シェルからコマンドをパイプしてみましょう。
echo 'echo foo; read <&9; echo bar' | bash
...まあ、それは簡単です。もちろん、まだ終わっていません。私たちはそれをきれいにする必要があります。
exec 9<&-
さて、もう終わりました。
ただし、コマンドを少しだけグループ化すると、クリーンアップ操作を回避できます。
{ echo 'echo foo; read <&9; echo bar' | bash; } 9<&0
この場合、記述子は、割り当てられた複合コマンドが有効な場合にのみ有効です。