我遇到过这段代码但无法理解exec >&p
根据我的理解编辑1:
#! /usr/bin/ksh
exec 4>&1 ## standard output is first saved as file descriptor 4
tail -5 >&4 |& ## spawn it as co process
exec >&p ## output of co-process is moved to standard output
cat /etc/passwd ## this can be any command like ps aux
exitcode=$?
exec >&- >&4 ## standard output is closed using >&-
wait
echo exitcode = $exitcode
exit 0
答案1
>&p
shell中的特殊重定向ksh93
将标准输出流重定向到当前作为协进程运行的命令的标准输入。
在给出的示例中,该tail -5
命令是通过使用 启动为协进程的|&
,并使用exec >&p
脚本将所有输出重定向到该进程(仅示例中tail
的输出)。cat
原始标准输出首先保存为文件描述符 4 exec 4>&1
(并且也写入文件描述符 4 tail
),然后在exec >&4
最终的 之前恢复echo
。
编写相同内容的另一种方法,无需所有文件描述符杂耍,将是
tail -n 5 /etc/passwd
printf 'exitcode = %d\n' "$?"
(虽然$exitcode
这里将是 的退出状态tail
而不是 的cat
)