Answers:
也有过程替代。这使得进程可以代替文件。
您可以stderr
按以下方式发送到文件:
process1 2> file
但是您可以按以下步骤用文件代替进程:
process1 2> >(process2)
这是一个发送stderr
到屏幕并附加到日志文件的具体示例
sh myscript 2> >(tee -a errlog)
weston --help 2> >(less)
),它打破了我的贝壳,我不得不退出并重新登录。
weston --help
和less
都希望与键盘进行交互,但是只有其中之一接收到它,那么您可能处于尴尬境地。尝试使用类似的方法进行测试grep
。另外,您可能会发现两个鼠标/键盘输入都将转到第二个命令,而不是转到weston。
您可以使用以下技巧来交换 stdout
和stderr
。然后,您只需使用常规管道功能即可。
( proc1 3>&1 1>&2- 2>&3- ) | proc2
提供stdout
并且stderr
都在开始时都指向相同的地方,这将为您提供所需的内容。
该x>y
位的作用是更改文件句柄,x
以便现在将其信息发送到文件句柄y
当前指向的位置。对于我们的特定情况:
3>&1
创建一个新的手柄3
,该手柄将输出到当前手柄1
(原始标准输出),只是将其保存在下面的最后一个项目符号点的某个位置。1>&2
修改句柄1
(stdout)以输出到当前句柄2
(原始stderr)。2>&3-
修改句柄2
(stderr)以输出到当前句柄3
(原始stdout),然后关闭句柄3
(通过-
末尾的)。它实际上是您在排序算法中看到的swap命令:
temp = value1;
value1 = value2;
value2 = temp;
1>&2-
在这里而不是仅仅使用它的价值是什么1>&2
?我不明白为什么我们要立即关闭fd 2
,如果我们要立即重新打开/重新分配它。
Bash 4具有此功能:
如果使用“ |&”,则命令1的标准错误通过管道连接到命令2的标准输入;它是2>&1 |的简写。标准错误的隐式重定向是在命令指定的任何重定向之后执行的。
zsh也具有此功能。
-
对于其他/较旧的外壳,只需将其明确输入为
FirstCommand 2>&1 | 其他命令
OtherCommand
将合并的数据写入某个地方,可能在其他地方。因此,它不是相同的数据,并且可能会转移到其他地方。那与OP的愿望相反,不是吗?
proc1
输出到stdout和stderr,并且您希望stderr转到stdin proc2
(这是proc1的stdout所在的位置),那么我的答案就可以实现。我给了OP他所要的,也许不是他要的。其中存在潜在的歧义。OP接受了交换 stdout和stderr 的答案,这不是他要求的。
rc
另一个shell中进行如此简单的重定向。例如:proc1 |[2] proc2
。好不好 不是bash
虽然。