在 POSIX 脚本中将输出重定向到 /dev/fd/x,其中 /dev/fd/x 替换进程替换

在 POSIX 脚本中将输出重定向到 /dev/fd/x,其中 /dev/fd/x 替换进程替换

我有一个可能的 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

相关内容