Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在没有EOF信号等待的情况下,将多个命令传输到单个命令_Bash_Shell_Grep_Pipe - Fatal编程技术网

Bash 在没有EOF信号等待的情况下,将多个命令传输到单个命令

Bash 在没有EOF信号等待的情况下,将多个命令传输到单个命令,bash,shell,grep,pipe,Bash,Shell,Grep,Pipe,如何将std从多个命令传输到单个命令?比如: (cat my_program/logs/log.*;tail -0f my_program/logs/log.0) | grep "filtered lines" 我希望使用管道在单个命令行上运行以下所有命令,并且不重定向到临时文件(如果可能)。有一点细微差别意味着我不能使用括号;我希望最后一个命令是尾部馈送,所以我希望grep发生在std接收到每一行之后,而不是等待EOF信号 如果命令不必并行执行,则可以使用cat将输出统一为单个连续流,如下所

如何将std从多个命令传输到单个命令?比如:

(cat my_program/logs/log.*;tail -0f my_program/logs/log.0) | grep "filtered lines"

我希望使用管道在单个命令行上运行以下所有命令,并且不重定向到临时文件(如果可能)。有一点细微差别意味着我不能使用括号;我希望最后一个命令是尾部馈送,所以我希望grep发生在std接收到每一行之后,而不是等待EOF信号

如果命令不必并行执行,则可以使用cat将输出统一为单个连续流,如下所示:

tail -0f log.0 | cat - log.* | grep "filtered lines"

魔术位是cat的-参数;它告诉cat获取stdin并将其添加到要连接的输入列表中(在本例中,其他输入是日志文件)。

尝试使用当前shell而不是子shell:

{ cat file1; tail -f file2; } | grep something

右大括号前的分号是必需的。

好的,我有一个混乱的解决方案(这是一个脚本-遗憾的是,这对于命令行来说是不实际的):

我还包括一个删除FIFO的陷阱:

trap OnExit SIGINT SIGTERM

遗憾的是,这不起作用,因为它想把日志放在进程结束时结束的尾部提要之后。计划是让grep运行所有日志“cat log.*”,然后轮询新添加的任何内容,以对“tail-0f log.0”执行相同的操作。我会分别在每个命令上运行grep,但是grep只代表管道连接在一起的命令列表中的一个,所以我担心在cat和tail-0f之间添加到这个详细日志中的任何内容都会丢失。谢谢你的聪明建议,但是布鲁塞尔有没有考虑过使用命名管道?运行一个脚本,该脚本包含一个从fifo读取的循环,并通过过滤器对输出进行管道传输。然后,您可以将数据输入fifo。例如,cat log.*>/path/to/pipe后跟tail-0f log.0>/path/to/pipe。不,我没有考虑到这一点。当用户发送SIGINT时,需要做一些整理(即移除FIFO),但我想我可以使用trap命令来完成这项工作。这也许是一条路要走。。。再次感谢布鲁斯!我同意使用新shell是毫无意义的,并且可能会导致在等待EOF时缓冲输出。但我尝试得太早了,对EOF的等待太久了,所以这不是唯一的事情。我很惊讶在命令行中没有一个简单的方法可以做到这一点。嗯,
tail-f
永远不会给你EOF,那么你为什么期待它呢<代码>grep可以在没有任何错误的数据流上运行EOF@glennjackman我使用上面的代码来说明我需要做什么,我知道当使用
tail-f
时命令不起作用,但问题不在于
grep
,因为
tail-0f my_程序/logs/log.0 | grep“筛选行”
起作用。因此,我需要一些其他方法来连接
cat my_program/logs/log.*
tail-0f my_program/logs/log.0
,因此我需要另一种方法来导致等待EOF。
while [[ -p /tmp/logfifo ]]
trap OnExit SIGINT SIGTERM