Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 重定向/管道到read命令_Bash_Shell_Scripting_Pipe_Zsh - Fatal编程技术网

Bash 重定向/管道到read命令

Bash 重定向/管道到read命令,bash,shell,scripting,pipe,zsh,Bash,Shell,Scripting,Pipe,Zsh,这是我上一个问题的后续。我仍在尝试从另一个脚本shallowScript中命令一个脚本deepScript,并在终端上显示之前处理其输出。下面是一个代码示例: deepScript.sh #!/bin/zsh print "Hello - this is deepScript" read "ans?Reading : " print $ans #!/bin/zsh function __process { while read input; do echo $inpu

这是我上一个问题的后续。我仍在尝试从另一个脚本
shallowScript
中命令一个脚本
deepScript
,并在终端上显示之前处理其输出。下面是一个代码示例:

deepScript.sh

#!/bin/zsh
print "Hello - this is deepScript"
read "ans?Reading : "
print $ans
#!/bin/zsh

function __process {
    while read input; do
        echo $input | sed "s/e/E/g"
    done }

print "Hello - this is shallowScript"
. ./deepScript.sh |& __process
shallowScript.sh

#!/bin/zsh
print "Hello - this is deepScript"
read "ans?Reading : "
print $ans
#!/bin/zsh

function __process {
    while read input; do
        echo $input | sed "s/e/E/g"
    done }

print "Hello - this is shallowScript"
. ./deepScript.sh |& __process
(编辑:此语法和下面粘贴的2个备选方案的结果)

[更新]

我已经为上次重定向
尝试了其他语法/deepScript.sh |&u进程
,每种语法都有不同的结果,但当然它们都不是我想要的结果。我将粘贴每个语法和
/shallowScript.sh
的结果输出(在
读取时键入“input”)以及我目前的发现

选项1:
/deepScript.sh |和u进程

由此看来,
/deepScript.sh
是从子shell运行的,但不是
\u进程
。输出:

zsh : ./shallowScript.sh
Hello - this is shallowScript
HEllo - this is dEEpScript
input
REading : input
基本上,前两行按预期打印,然后脚本直接等待stdin输入,而不是打印提示符
读取:
,然后打印提示符并执行
print$ans


选项2:
\u过程<观察到的延迟来自两个因素:

  • deepScript.sh
    进程
    异步运行
  • read
    返回前读取完整的一行

  • deepScript.sh
    将提示写入标准错误,但没有换行符。然后,它等待您的输入,而
    进程
    继续等待写入一整行,以便它对
    读取
    的调用可以完成。

    chepner,您有什么建议的解决方法吗?我建议不要尝试同时处理标准输出和标准错误。它们是两个独立的流,任何将它们合并(通过管道将两者合并到同一个命令中)的尝试都将导致它们以不确定的方式交错。
    \uu process
    究竟做了什么,它需要同时处理这两个方面?事实上,我考虑这一点的唯一原因是因为
    read
    将其提示符打印到stderr(至少zsh的内置read)。但是没有它我可以活下去;无论如何,在上面的选项2和3中,我只尝试将
    deepScript
    的标准输出发送到
    \u进程
    ,并复制了上面的时髦结果。在现实生活中,
    \u进程
    对输出执行一些
    sed
    ,并根据某些模式的存在进行一些日志记录。似乎在
    read
    等待
    \n
    时,我必须找到解决方法。