我想修改并重定向所有正在运行的进程的输出。我知道,如果我知道过程的名称,我可以做这样的事情
process 2>&1 >/dev/null
将stderr和stdout重定向到dev / null。首先,如何在将stdout发送到dev / null或其他任何地方之前修改它?一种可能的解决方案是
process 2>&1 | awk '{print "$SOME_ENV_VAR|" $0;}' > dev/null
这是正确的方法吗?是否能够重定向stdout和stderr?
如果不是重定向到dev / null,我想打印到控制台怎么办?
更大的问题是,如何为每个正在运行的进程执行此操作?我需要在linux框中执行此操作,我不知道正在运行的进程的名称。这可行吗?
我是shell脚本的新手,所以请原谅我这些问题是微不足道的。
答案 0 :(得分:1)
从讨论中可以看出你并不是真的想要的 将已经运行的进程的输出重定向到其他位置。但您似乎正在尝试修改正在开始的流程的输出。
使用bash(似乎是您正在使用的),您可以使用[FD]>TARGET
resp。 [FD]<SOURCE
用于指定进程的I / O通道。 FD
是可选的,是文件描述符号。将其遗漏意味着0
上的<
(= stdin)和1
上的>
(= stdout)。 (2
是stderr的着名文件描述符)。 TARGET
或SOURCE
我是文件系统对象(例如文件,设备,命名管道,unix域套接字)或&FD
其中FD
再次是文件描述符编号并指示(打开)filedescriptor使用。
您将使用它,例如通过写入:2>&1
将错误输出发送到stdout所在的位置。
如果您现在想要对进程的输出进行后处理(实际上这是shell术语中的管道,因为它可能是由几个命令和I / O重定向组成的任何复杂(shell)语句。)
你将使用管道:(A | B
)。
这基本上将进程A的stdout与进程B的stdin连接起来。
对于操作输出,您可以使用任何其他unix命令或程序。最常见的是sed
(用于应用基于正则表达式的替换)或awk
。其他人也可能会推荐perl
或python
。
在您的情况下,您打算在每个行前面加上一些环境变量给出的前缀。
使用awk
,您可以按如下方式编写:
awk '{ print "'"$SOME_ENV_VAR"'|" $0;}'
或将外部值作为awk变量传递:
awk -v var="$SOME_ENV_VAR" '{ print var "|" $0;}'
更进一步:
使用bash输出重定向非常强大。例如,你可以将stdout传递给一个管道并将sterr传递给另一个管道。例如:
(((echo hallo; echo ERROR >&2) | awk '{ print "stdout|" $0; }' >&4) 2>&1| awk '{ print "stderr: " $0;}' ) 4>&1
这将通过单独的awk实例处理stdout和sterr,并将(组合)输出发送到shell的正常stdout。