当脚本运行时,其中的命令可能会向 stdout/stderr 输出一些文本。Bash 本身也可能输出一些文本。
但是如果同时运行几个脚本,就很难确定错误是从哪里来的。
那么是否可以在脚本的所有输出中插入前缀?就像是:
#!/bin/bash
prefix 'PREFIX' &2
echo "wrong!" >&2
然后:
$ ./script.sh
PREFIXwrong!
当脚本运行时,其中的命令可能会向 stdout/stderr 输出一些文本。Bash 本身也可能输出一些文本。
但是如果同时运行几个脚本,就很难确定错误是从哪里来的。
那么是否可以在脚本的所有输出中插入前缀?就像是:
#!/bin/bash
prefix 'PREFIX' &2
echo "wrong!" >&2
然后:
$ ./script.sh
PREFIXwrong!
您可以将 stderr/stdout 重定向到添加所选前缀的进程替换。例如,这个脚本:
产生这个输出:
foo:
前两行分别将 stdout 和 stderr 重定向到添加和输入的 sed 命令foo: (stderr)
。对 shell 内置命令的调用
trap
确保在使用 . 终止脚本Ctrl+C
或通过SIGTERM
使用kill $pid
. 这可确保您的 shell 不会强制终止您的脚本,因为stdout
文件描述符在sed
退出时会消失,因为它也收到了终止信号。实际上,您仍然可以在主脚本中使用退出陷阱,并且sed
仍将运行以处理运行退出陷阱时生成的任何输出。主脚本结束后,子shell 仍应退出,因此sed
进程不会永远运行。您可以通过某种替换行的方式来管道输出:
另请检查24337
或者只是将单独的输出定向到终端中的单独文件/屏幕(1)选项卡/选项卡/...
bash 中的一个选项是通过重定向到进程替换来做到这一点,如下所示:
这存在输出可能乱序的问题(正如 Charles Duffy 在评论中提到的那样)。它也真的很烦人。但是你可以为它创建一个包装函数:
或者通过使用命令名称作为前缀使其更简单: