我有一个程序(middle
我叫它),无法修改。
该程序执行以下步骤序列:
middle
向stdout发送一些文本(echo Text1
)middle
调用inner.sh
将一些文本字符串(小于等于4 KB)作为参数(inner.sh "Deferred Message"
)的Shell脚本middle
向stdout发送一些文本(echo Text2
)我的任务是创建两个bash脚本,outer.sh
并inner.sh
在middle
进程生成的所有其他消息之后排列延迟的消息。
结果标准输出必须是以下内容:
Text1
Text2
Deferred Message
要求:
outer.sh
应该调用middle
(middle
并将调用inner.sh
)。inner.sh
必须在某处记住其参数(延迟的消息)middle
被终止,outer.sh
必须回顾推迟的消息,并打印到stdoutouter.sh
进程同时运行。延迟的消息必须存储在当前outer.sh
流程实例本地的位置内部.sh
# Where should I save message "$1"?
外.sh
middle "$@"
# How should I recall and print the deferred message?
我应该将延迟的消息保存在子进程中的什么位置,以及如何在父进程中将其读回?
inner.sh
可能:
printf '%s\n' "$1" >&3
在中outer.sh
,您可以执行以下操作:
{ inner=$(middle "$@" 3>&1 >&4 4>&-); } 4>&1
printf '%s\n' "$inner"
内部文本通过管道(在命令替换中)传递,并存储在shell变量中。假设middle
在调用之前没有关闭fd 3 inner.sh
(尽管没有理由这样做)。
解释:
{ ... } 4>&1
。在该命令组中,最初,fd 1和4都指向原始stdout。IOW,我们已经将external.sh的stdout复制到fd 4上,以便能够在命令替换中恢复它$(...)
。在该命令替换中,stdout(fd 1)是管道。这就是命令替换的重点。它想获取命令的输出。但是在这里,我们不需要stdout middle
,我们想要它(或更确切地说是它的child inner.sh
)在fd 3上写的内容,因此:middle 3>&1 >&4 4>&-
:对于middle
,我们将fd 3设置为cmdsubst管道,以便将其中的内容inner.sh
写入$inner
,然后将middle
的stdout恢复到fd 4上保存的原始stdout上。在达到其目的后关闭fd 4,因为middle
不需要用它做任何事。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句