bash将文本前置到命令打印的每一行

bash将文本前置到命令打印的每一行,bash,stdout,Bash,Stdout,我正试图找到一种方法来做这样的事情: # script.sh: cmd0 set_prepend "some text" cmd1 cmd2 cmd3 unset_prepend cmd4 然后,无论cmd1、2和3生成什么标准输出,每一行都将以“some text”作为前缀。命令之间没有关系,命令可以是任何东西(ls、cat、awk,无论什么): 我所能想到的唯一方法是远离优雅: script.sh | prepender 对于prepender接收到的每一行,它检查文件的存在;如果文件

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

# script.sh:
cmd0
set_prepend "some text"
cmd1
cmd2
cmd3
unset_prepend
cmd4
然后,无论cmd1、2和3生成什么标准输出,每一行都将以“some text”作为前缀。命令之间没有关系,命令可以是任何东西(ls、cat、awk,无论什么):

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

script.sh | prepender 

对于prepender接收到的每一行,它检查文件的存在;如果文件存在,则内容为要前置的文本;set_prepend将创建该文件,unset_prepend将删除该文件。然而,缓冲会干扰这一点,所以它必须关闭,我不确定如何保证在执行下一个脚本cmd之前,将由prepender处理一行到stdout(否则可能出现争用条件)

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

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

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

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

好的,我以前用过一次exec:>并且文档是清晰的,如果exec没有命令,那么当前的shell输出将根据exec重定向。。。但是我很困惑:例如,在unset中,似乎您正在将1重定向到3,然后关闭3,但这不可能是正确的;在集合中,你将一个新的FD,3重定向到标准输出1,但是没有任何东西被发送到FD 3。。。关于重定向,有一点我不太理解,如果你能扩展它,我会非常感激的。好吧,我知道了:3>&1意味着发送到FD 3的所有内容都将发送到stdout,而不是FD 1;管道意味着stdout将进入管道。然后要恢复,你让1转到3,但3将转到标准输出,所以实际上1回到标准输出,然后关闭FD3。这完全是疯狂,同时也是辉煌。是的,你明白了。从左到右的顺序很重要--您将1重定向到3,然后关闭3,但1仍然打开。好的,我以前使用过一次exec:>并且文档是清晰的,如果exec没有命令,那么当前shell输出将根据exec重定向。。。但是我很困惑:例如,在unset中,似乎您正在将1重定向到3,然后关闭3,但这不可能是正确的;在集合中,你将一个新的FD,3重定向到标准输出1,但是没有任何东西被发送到FD 3。。。关于重定向,有一点我不太理解,如果你能扩展它,我会非常感激的。好吧,我知道了:3>&1意味着发送到FD 3的所有内容都将发送到stdout,而不是FD 1;管道意味着stdout将进入管道。然后要恢复,你让1转到3,但3将转到标准输出,所以实际上1回到标准输出,然后关闭FD3。这完全是疯狂,同时也是辉煌。是的,你明白了。从左到右的顺序很重要——将1重定向到3,然后关闭3,但1仍然打开。