bash在命令打印的每一行之前添加文本

时间:2018-11-01 02:08:41

标签: bash stdout

我正试图找到一种方法来做这样的事情:

# script.sh:
cmd0
set_prepend "some text"
cmd1
cmd2
cmd3
unset_prepend
cmd4

然后,无论cmd1、2和3生成什么stdout,每行都将以“ some text”开头。命令之间没有关系,并且命令可以是任何东西(ls,cat,awk等):

$ script.sh
cmd0 line1
...
cmd0 lineN0
some text cmd1 line1
some text ...
some text cmd1 lineN1
some text cmd2 line1
some text ...
some text cmd2 lineN2
some text cmd3 line1
some text ...
some text cmd3 lineN3
cmd4 line1
...
cmd4 lineN4

我能想到的唯一方法远不是优雅:

script.sh | prepender 

并针对prepender收到的每一行,检查文件是否存在;如果文件存在,则内容为要添加的文本;然后set_prepend将创建该文件,而unset_prepend将删除该文件。但是缓冲会对此产生干扰,因此必须将其关闭,而且我不确定如何保证在执行下一个脚本cmd之前,要执行predender的处理将输出到stdout的行(否则可能发生竞争)。

1 个答案:

答案 0 :(得分:2)

使用exec将输出重定向到管道。您需要将旧的stdout保存在另一个FD中,以便以后恢复。

set_prepend() {
    exec 3>&1 | sed "s/^/$1 /"
}
unset_prepend() {
    exec >&3 3>&-
}