重定向/管道进入读取命令

时间:2014-09-24 06:40:10

标签: bash shell scripting pipe zsh

这是我之前关于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行之前打印到终端,但现在它等待读取完成。

两个问题:

  • 这应该是预期的吗?
  • 是否有修复或解决方法?

1 个答案:

答案 0 :(得分:1)

观察到的延迟源于两个因素:

  1. deepScript.shprocess异步运行
  2. read在返回
  3. 之前读取完整的一行

    deepScript.sh将提示写入标准错误,但没有换行符。然后,当process继续等待写入一整行时,它会等待您的输入,以便其对read的调用可以完成。