这是我之前关于SO的问题的后续跟进。我仍在尝试从另一个脚本deepScript
中命令脚本shallowScript
并在终端上显示之前处理其输出。这是一个代码示例:
deepScript.sh
#!/bin/zsh
print "Hello - this is deepScript"
read "ans?Reading : "
print $ans
shallowScript.sh
#!/bin/zsh
function __process {
while read input; do
echo $input | sed "s/e/E/g"
done }
print "Hello - this is shallowScript"
. ./deepScript.sh |& __process
(已编辑:此语法的结果以及下面粘贴的两个替代方案)
[UPDATE]
我为最后一次重定向. ./deepScript.sh |& __process
尝试了其他语法,每种语法都有不同的结果,但当然没有一种是我想要的。我将粘贴每个语法以及./shallowScript.sh
的结果输出(当read
等待输入时我输入“输入”),以及到目前为止我的发现。
选项1: . ./deepScript.sh |& __process
从link开始,似乎. ./deepScript.sh
是从子shell运行的,而不是__process
。输出:
zsh : ./shallowScript.sh
Hello - this is shallowScript
HEllo - this is dEEpScript
input
REading : input
基本上,前两行是按预期打印的,然后脚本不是打印提示符REading :
,而是直接等待stdin输入,然后打印提示并执行{ {1}}。
选项2: print $ans
Zsh的manpage表示__process < <(. ./deepScript.sh)
将作为子进程运行。对我来说,这看起来类似于选项1 。输出:
(. ./deepScript.sh)
因此,在 Hello - this is shallowScript
Reading : HEllo - this is dEEpScript
input
input
中的,它会在打印(脚本行2)之前打印读取提示(脚本行3)。奇怪。
选项3: . ./deepScript.sh
根据相同的manpage,__process < =(. ./deepScript.sh)
这里将其输出发送到临时文件,然后在(. ./deepScript.sh)
中注入(我不知道是否存在子进程) )。输出:
__process
同样,deepScript的第3行在第2行之前打印到终端,但现在它等待读取完成。
两个问题:
答案 0 :(得分:1)
观察到的延迟源于两个因素:
deepScript.sh
和process
异步运行read
在返回 deepScript.sh
将提示写入标准错误,但没有换行符。然后,当process
继续等待写入一整行时,它会等待您的输入,以便其对read
的调用可以完成。