我试图在 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
接收然后输出命令输出)。我想我只是非常误解流程替换在这一点上是如何工作的