一時ファイルを使用せずに子プロセスで遅延されたstdoutをどのように実装できますか?

一時ファイルを使用せずに子プロセスで遅延されたstdoutをどのように実装できますか?

middle変更できないプログラム(名前を指定します)があります。
プログラムは、次の一連のステップを実行します。

  • middleいくつかのテキストをstdoutに送信する(echo Text1
  • middleinner.sh一部のテキスト文字列(4KB以下)を引数(inner.sh "Deferred Message")に渡してシェルスクリプトを呼び出します。
  • middleいくつかのテキストをstdoutに送信する(echo Text2

私の使命は、2つのbashスクリプトを生成outer.shし、inner.shプロセスによって生成された他のすべてのメッセージの後に遅延メッセージをスケジュールすることですmiddle
生成される標準出力は次のようになります。

Text1
Text2
Deferred Message

必要:

  • outer.sh呼び出す必要がありますmiddlemiddleそして呼び出されますinner.sh)。
  • inner.shそのパラメータはどこかに覚えておく必要があります(遅延メッセージ)。
  • middle終了したら、outer.sh遅延メッセージを呼び出して標準出力に印刷する必要があります。
  • 同時に実行されるプロセスがたくさんありますouter.sh。遅延メッセージは、outer.sh現在のプロセスインスタンスにローカルに保存する必要があります。
  • ファイルシステムで一時オブジェクトの作成を許可しません。 (遅延メッセージをメモリのどこかに保存できますか?)

内部.sh

# Where should I save message "$1"?

外部.sh

middle "$@"
# How should I recall and print the deferred message?

子プロセスで遅延メッセージをどこに保存する必要があり、親プロセスでどのように読み取ることができますか?

答え1

inner.sh可能:

printf '%s\n' "$1" >&3

では、outer.sh次のことができます。

{ inner=$(middle "$@" 3>&1 >&4 4>&-); } 4>&1
printf '%s\n' "$inner"

内部テキストはパイプで連結され(コマンドの置き換え)、シェル変数に保存されます。middle呼び出す前にfd 3が閉じられないと仮定しますinner.sh(しかしそれを行う理由はありません)。

説明する:

  • { ... } 4>&1。このコマンドグループでは、最初にfd 1と4はどちらも生のstdoutを指しています。 IOW、コマンドオーバーライドから復元できるように、outer.shのstdoutをfd 4にコピーしました。
  • $(...)。このコマンドの置き換えでは、stdout(fd 1)はパイプです。これがコマンド置換のポイントです。コマンドの出力を取得しようとしています。しかし、ここで私たちはstdoutをしたくないので、それ(またはその子)がfd 3に書きたいとmiddle思います。inner.sh
  • middle 3>&1 >&4 4>&-:For、私たちはmiddlecmdsubstパイプにfd 3を設定し、stdoutを次に復元します。inner.sh$innermiddle保存済みfd 4の生標準出力。 fd 4が目的を達成した後は、middleいかなる措置も実行する必要がないので終了します。

関連情報