我试图在 BASH 命令中使用多个进程替换,但我似乎误解了它们解析和重定向到彼此的顺序。
系统
Ubuntu 18.04
BASH 版本 - GNU bash,版本 4.4.20(1)-release (x86_64-pc-linux-gnu)
问题
我正在尝试将命令的输出重定向到tee,将该重定向到ts(添加时间戳),然后将该重定向到split(将输出拆分为单独的文件)。我可以将输出重定向到tee,ts但是在重定向到时split遇到问题。
我的尝试
command >(tee -a >(ts '[%Y-%m-%d %H:%M:%S]' > tempfile.txt))- 这会将输出重定向到进程替换,tee然后再重定向到进程替换ts并添加时间戳,然后重定向到 tempfile.txt这就是我所期望的
command >(tee -a >(ts '[%Y-%m-%d %H:%M:%S]' >(split -d -b 10 -)))- 即使我希望结果是一堆 10 字节的文件,在不同的行上有时间戳,这也无济于事。
为了继续测试,我尝试显然这无关紧要,因为我得到了新结果 - 请参阅底部的编辑echo查看会发生什么
command >(tee -a >(ts '[%Y-%m-%d %H:%M:%S]' >(echo)))- 初始tee打印的打印(应该如此)但echo打印一个空行
command >(tee -a >(ts '[%Y-%m-%d %H:%M:%S]') >(split -d -b 10 -))- 这会打印带有时间戳的命令(如tee和ts应该),此外还会创建带有命令输出的 10 字节文件(上面没有时间戳)。-这是我所期望的并且是有意义的,因为 tee 被分别重定向到两个进程替换,这主要是一个健全性检查
我认为正在发生的事情
据我所知>(ts '[%Y-%m-%d %H:%M:%S]' >(split -d -b 10 -)) (,首先将其解决为一个完整且独立的命令。因此>(ts '[%Y-%m-%d %H:%M:%S]' >(echo))就此而言)split( 和echo) 正在接收一个空输出,ts它本身没有输出。只有在这之后,实际的命令才会解析并将其输出发送给它的替代tee。
这并不能解释为什么command >(tee -a >(ts '[%Y-%m-%d %H:%M:%S]' > tempfile.txt))这个理论tee本身没有输出,所以ts应该接收不输入并且还应该输出空白。
所有这一切都是说我不确定发生了什么。我认为这与解决流程替换的顺序以及重定向的发生方式有关,但对我来说它到底是如何发生的毫无意义。
我想要的是
基本上我只是想了解如何以command >(tee -a >(ts '[%Y-%m-%d %H:%M:%S]' >(split -d -b 10 -)))看起来应该的方式进行工作。我需要命令输出将自身发送到进程替换tee,进程替换会将其发送到进程替换ts,并添加时间戳,将其发送到split并将输出拆分为几个小文件。
感谢您抽出宝贵时间以及您能提供的任何帮助。
*编辑- 我刚刚尝试command > >(echo)看到输出是空白的,这不是我所期望的(我期望echo接收然后输出命令输出)。我想我只是非常误解流程替换在这一点上是如何工作的