middle
変更できないプログラム(名前を指定します)があります。
プログラムは、次の一連のステップを実行します。
middle
いくつかのテキストをstdoutに送信する(echo Text1
)middle
inner.sh
一部のテキスト文字列(4KB以下)を引数(inner.sh "Deferred Message"
)に渡してシェルスクリプトを呼び出します。middle
いくつかのテキストをstdoutに送信する(echo Text2
)
私の使命は、2つのbashスクリプトを生成outer.sh
し、inner.sh
プロセスによって生成された他のすべてのメッセージの後に遅延メッセージをスケジュールすることですmiddle
。
生成される標準出力は次のようになります。
Text1
Text2
Deferred Message
必要:
outer.sh
呼び出す必要がありますmiddle
(middle
そして呼び出されます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、私たちはmiddle
cmdsubstパイプにfd 3を設定し、stdoutを次に復元します。inner.sh
$inner
middle
保存済みfd 4の生標準出力。 fd 4が目的を達成した後は、middle
いかなる措置も実行する必要がないので終了します。