我有一个可能的 POSIX 脚本,其中包括过滤 stderr 输出:
exec <cmd> "$@" 2> >(grep -v "blih bluh blah")
由于未定义进程替换(即 [SC3001]),因此不会发生重定向。我玩了文件描述符并看了这个邮政以及其他方面,但我不确定以下内容的含义:
exec <cmd> "$@" 2>/dev/fd/5; exec grep -v "blih bluh blah" 5<&- >&2
也许
exec <cmd> "$@" 2>/dev/fd/5 && grep -v "blih bluh blah" 5<&- >&2
欢迎批判性的眼光。
编辑:我的意图可能应该更接近于:
exec {<cmd> "$@"; grep -v "blah" /dev/fd/5 5<&- >&2} 5<&2
尽管我在这里至少可以感觉到两个问题:(我)grep 异步执行,因为它是在“;”后面指示的,并且(二)指定的重定向方式stderr
会影响当前 shell 执行环境。
另外上面的表达式 exec
后面是一个命令,所以shell被替换为<cmd>,而不需要创建新的进程。 POSIX 手册页指定,如果指定了参数,它们将被解释为 <cmd> 的参数。但这仅限于此吗"$@"
?
又如何exec
应对exec {<cmd1>; <cmd2>} 5<&2
?