我在exec上读过man,但仍然不理解我正在学习的脚本中的以下两行的结果:
exec >> >(tee -a $logfile)
exec 2>&1我读过这个答案,但仍然有疑问。
我的理解是,第一行使>>输出(附加)也能输出到$logfile,另外,在脚本文件中,>>的右边还有什么。
第二行将在脚本中将输出重定向到2 (stderr)到1 (stdout)。
someapp &。我希望在终端中运行这个命令--独立于脚本独立运行--其效果与脚本中运行的效果相同。我应该如何修改someapp &,使其与上面的execs设置重定向?发布于 2023-01-12 20:10:02
主管>> >(tee -a $logfile)
简称:
exec 1>> >(tee -a $logfile)是否相当于:
exec 1>> /dev/fd/x其中x是指向管道写入端的文件描述符。
在此之前,bash已经启动了一个子进程,它的fd 0 (stdin)连接到管道的另一端,同时忙于执行tee。
exec 1>> file,使用O_APPEND和不带O_TRUNC打开文件,并将得到的fd移动到1。
根据系统的不同,打开/dev/fd/x就像执行dup(x) (大多数)一样,或者打开与fd x上打开的文件相同的文件(仅限Linux和cygwin )。在这里,在管道上打开fd,这没有什么区别,O_APPEND和O_TRUNCATE标志是无关的,所以它和exec > >(...)是一样的。
这有点离题,但tee -a $logfile是不正确的,如果目的是打开路径存储在$logfile中的带有O_APPEND的文件,则应该是O_APPEND。
因此,在该命令之后,shell中的fd 1将指向一个管道。在管道的另一端,tee读取即将到来的内容,而tees则将其读取到$logfile的末尾和重定向之前的stdout所指向的位置(如果脚本的输出以某种方式重定向,则可能是终端设备或其他什么东西)。
exec 2>&1
使fd 2指向与fd 1相同的东西,因此相同的管道.
为了能够在这种情况下,您必须保存打开的文件描述-- fds 1和2是在单独的fds上打开的--然后再进行重定向:
exec 3>&1 4>&2 > >(tee -a -- "$logfile") 2>&1在3>&1执行dup2(1, 3)的情况下,fd 3现在指向与fd 1相同的打开文件描述。
为了撤销,
exec >&3 2>&4 3>&- 4>&-或者运行someapp时,它的stdout和stderr是原始的stdout和stderr:
someapp >&3 2>&4 3>&- 4>&- &https://unix.stackexchange.com/questions/731516
复制相似问题