【问题标题】:Redirect / pipe into read command重定向/管道到读取命令
【发布时间】:2014-09-24 06:40:10
【问题描述】:

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

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

(已编辑:此语法的结果和下面粘贴的 2 个替代方法)

[更新]

我已经尝试了上次重定向. ./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输入,然后打印提示并执行print $ans .

选项 2: __process < <(. ./deepScript.sh)

Zsh 的manpage 表示(. ./deepScript.sh) 将作为子进程运行。对我来说,这看起来类似于选项 1。输出:

Hello - this is shallowScript
Reading : HEllo - this is dEEpScript
input
input

所以,. ./deepScript.sh,它在打印(脚本第2行)之前打印读取的提示(脚本第3行)。奇怪。

选项 3: __process < =(. ./deepScript.sh)

根据同样的manpage(. ./deepScript.sh)这里将其输出发送到一个临时文件,然后注入__process(不知道有没有子进程)。输出:

Hello - this is shallowScript
Reading : input
HEllo - this is dEEpScript
input

再次,deepScript 的第 3 行在第 2 行之前打印到终端,但现在它等待读取完成。

两个问题:

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

【问题讨论】:

    标签: bash shell scripting pipe zsh


    【解决方案1】:

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

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

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

    【讨论】:

    • chepner,您有什么可以推荐的解决方法吗?
    • 我建议不要尝试同时处理标准输出和标准错误。它们是两个独立的流,任何合并它们的尝试(通过管道将它们合并到同一个命令中)都会导致它们以不确定的方式交错。 __process 真的做了什么需要处理两者?
    • 实际上,我想到这个的唯一原因是因为read 将其提示打印到 stderr(至少 zsh 的内置读取)。但是没有它我也可以生活;无论如何,在上面的选项 2 和 3 中,我只尝试将deepScript 的标准输出发送到__process,并在上面复制了时髦的结果。在现实生活中,__process 在输出上执行一些 sed + 一些日志记录,具体取决于某些模式的存在。看来read 等待\n 我必须找到解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    相关资源
    最近更新 更多