从讨论中可以看出,你并不是真的希望 将已经运行的进程的输出重定向到其他地方。但你似乎试图修改你开始的过程的输出。
随着bash(似乎是你在用什么),你可以使用[FD]>TARGET
resp。 [FD]<SOURCE
用于指定进程的I/O通道。 FD
是可选的并且是文件描述符编号。将它排除在和1
(=标准输出)>
上意味着0
(= stdin)。 (2
是stderr的着名文件描述符)。 TARGET
或SOURCE
我是文件系统对象(例如文件,设备,命名管道,unix域套接字)或&FD
,其中FD
再次是文件描述符编号并指示要使用的(打开)文件描述符。
您将使用它例如通过写入2>&1
将错误输出发送到标准输出所在的位置。
如果您现在要对进程的输出进行后处理(实际上,这是shell命名中的一个管道,因为它可能是由多个命令和I/O重定向组成的任何复杂(shell)语句。) 一个管道:(A | B
)。
这基本上连接进程A的标准输出和进程B的标准输入。
对于操作输出,您可以使用任何其他的unix命令或程序。最常见的是sed
(用于应用基于正则表达式的替换)或awk
。其他人也可能推荐perl
或python
。
在你的情况下,你打算用某个环境变量给出的前缀来加上每一行。
使用awk
可以按如下方式写:
awk '{ print "'"$SOME_ENV_VAR"'|" $0;}'
或外部值传递作为一个awk变量:
awk -v var="$SOME_ENV_VAR" '{ print var "|" $0;}'
借此得远一点:
使用bash输出重定向功能非常强大。例如,您可以将标准输出传递到一个管道和另一个管道。例如:
(((echo hallo; echo ERROR >&2) | awk '{ print "stdout|" $0; }' >&4) 2>&1| awk '{ print "stderr: " $0;}') 4>&1
这将处理由单独的AWK实例stdout和sterr和(组合)的输出发送到所述壳的正常标准输出。
来源
2016-04-27 16:09:28
rpy
首先,你应该说明你正在使用哪种外壳。在linux下,你很可能使用bash。然后,_running processes_建议您在启动进程后尝试修改I/O分配 - 这是不可能的(至少没有特殊的内核支持)。但是,您的示例建议您在进程启动时前往处理I/O。最后,你应该对你想达到的目标给予更多的批评。 sh(以及bash)在进程的stin/stdout/stderr可以相互连接方面非常强大。 – rpy
谢谢,我刚刚注意到'awk'{print“$ SOME_ENV_VAR |” $ 0;}''不会改变env变量。我如何在awk中使用环境变量? – AbtPst
这不是'awk'的属性,而是你使用单引号(''')和'awk'脚本参数的结果。如果例如它将插入。你确实使用过:'awk'{print'“$ SOME_ENV_VAR |”'$ 0;}''。但是,在发送'/ dev/null'之前,这只会将'$ SOME_ENV_VAR'中的值预加到'process'中的每一行。 – rpy