交换标准输入和标准错误后,grep将不起作用

时间:2018-09-25 09:17:20

标签: linux bash scripting file-descriptor nohup

我运行命令,我想从标准错误中消除包含“ nohup”的行。为此,我交换标准输入和标准错误,并过滤“ nohup”。然后,我再次交换它们以返回初始状态。像这样:

nohup COMMAND 3>&1 1>&2 2>&3 | grep -v nohup 3>&1 1>&2 2>&3 &

然后我进入文件,然后过滤出密码:

nohup COMMAND 3>&1 1>&2 2>&3 | grep -v nohup 3>&1 1>&2 2>&3  | tee FILE.log | grep -v "password" &

我不知道为什么grep -v "password"在这里不起作用。

如果我不进行双文件描述符交换,则会这样做:

nohup COMMAND  | tee FILE.log | grep -v "password" &

您对此有任何想法吗?

1 个答案:

答案 0 :(得分:2)

nohup COMMAND 3>&1 1>&2 2>&3 | grep -v nohup 3>&1 1>&2 2>&3中,您交换了nohup的stdout和stderr,以前的stderr进入了管道。以前的标准输出到哪里去? stderr最初指向的地方可能是终端。 grep的交换不会影响那个

您可能需要执行以下操作:

(nohup COMMAND 2>&1 1>&3 | grep -v nohup 1>&2) 3>&1 | tee FILE.log | grep -v "password" &

或者使用bash进程替换将stderr仅发送到grep:

nohup COMMAND 2> >(grep -v nohup >&2) | tee FILE.log | grep -v "password" &