1
992
首先将stderr重定向到管道的stdout_
有关各种I/O重定向的详细信息,请参阅 Redirections 在bash参考手册中。
注意,I/O重定向的顺序是从左到右解释的,但是管道是在解释I/O重定向之前设置的。文件描述符(如1和2)是对打开文件描述的引用。手术
|
2
323
或者将stderr和stdout的输出交换为过度使用:
这将创建一个新的文件描述符(3)并将其分配到与1(stdout)相同的位置,然后将fd 1(stdout)分配到与fd 2(stderr)相同的位置,最后将fd 2(stderr)分配到与fd 3(stdout)相同的位置。stderr现在可用作stdout,旧stdout保留在stderr中。这可能有点过分,但希望能提供更多关于bash文件描述符的详细信息(每个进程有9个可用的描述符)。 |
3
189
在bash中,还可以使用 process substitution :
对于手头的案件:
|
4
160
结合这些最佳答案,如果您这样做:
…然后所有stdout都保存为stdout 和 所有stderr都保留为stderr,但在stderr中不会看到包含字符串“something”的任何行。 这有一个独特的优点,即不会反转或丢弃stdout和stderr,也不会将它们弄脏在一起,也不会使用任何临时文件。 |
5
91
如果您考虑“重定向”和“管道”的实际情况,那么可视化事情就容易得多。bash中的重定向和管道只做一件事:修改进程文件描述符0、1和2指向的位置(请参见/proc/[pid]/fd/*)。 当一个 管 或者“”操作符出现在命令行上,首先发生的事情是bash创建一个fifo并将左侧命令的fd 1指向这个fifo,并将右侧命令的fd 0指向同一个fifo。 接下来,对每一方的重定向操作符进行评估 从左到右 和当前设置将在描述符出现重复时使用。这一点很重要,因为由于首先设置了管道,因此FD1(左侧)和FD0(右侧)已经与正常情况不同,任何重复都会反映出这一事实。 因此,当您键入如下内容时:
以下是发生的事情,顺序如下:
因此,“command”写入其fd 2(stderr)的所有输出都会进入管道,并由另一侧的“grep”读取。“command”写入其fd 1(stdout)的所有输出都会进入/dev/null。 如果改为运行以下命令:
以下是发生的事情:
所以,来自“command”的所有stdout和stderr都将转到/dev/null。管道中没有任何内容,因此“grep”将关闭,而不在屏幕上显示任何内容。 还要注意,重定向(文件描述符)可以是只读的(<)、只读的(>)或读写的(<>)。 最后一个音符。程序是否向FD1或FD2写入某些内容完全取决于程序员。良好的编程实践要求错误消息应该转到fd 2,正常输出到fd 1,但是您经常会发现混合了这两者的编程很草率,或者忽略了约定。 |
6
29
你在用bash吗?如果是这样:
http://www.gnu.org/software/bash/manual/bashref.html#Pipelines |
7
9
对于那些希望将stdout和stderr永久重定向到文件的用户,请在stderr上grep,但保留stdout以将消息写入tty:
|
8
5
这将把command1 stderr重定向到command2 stdin,同时保持command1 stdout不变。
取自 LDP |
9
1
我刚想出一个解决方案
给你。
以后移除命名管道可能是个好主意。 |
10
-1
我喜欢做这样的事情
|
11
-3
我试着跟随,发现它也起作用,
|
jjmerelo · 使用Proc::Async从绑定管道读取 6 年前 |
hytromo · 更新不只是最后一行输出 6 年前 |
Rob S. · 从python spawn子进程接收连续输出不工作 6 年前 |
Wolfat · 无法从C中的管道执行读取? 6 年前 |
Cloud · 将所有stdout/stderr全局重定向到记录器 6 年前 |
Lansana Camara · SSH,运行进程,然后忽略输出 6 年前 |