首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >"exec“的等效和撤消

"exec“的等效和撤消
EN

Unix & Linux用户
提问于 2023-01-12 15:51:17
回答 1查看 71关注 0票数 2

我在exec上读过man,但仍然不理解我正在学习的脚本中的以下两行的结果:

代码语言:javascript
运行
复制
exec >> >(tee -a $logfile)
exec 2>&1

我读过这个答案,但仍然有疑问。

我的理解是,第一行使>>输出(附加)也能输出到$logfile,另外,在脚本文件中,>>的右边还有什么。

第二行将在脚本中将输出重定向到2 (stderr)到1 (stdout)。

  1. 我的理解正确吗?
  2. 如何撤消上述命令,使撤消操作后的行为与执行这两行之前的行为相同?
  3. 让我们在脚本中进一步说明,我们在后台启动了一些应用程序,例如someapp &。我希望在终端中运行这个命令--独立于脚本独立运行--其效果与脚本中运行的效果相同。我应该如何修改someapp &,使其与上面的execs设置重定向?
EN

回答 1

Unix & Linux用户

发布于 2023-01-12 20:10:02

主管>> >(tee -a $logfile)

简称:

代码语言:javascript
运行
复制
exec 1>> >(tee -a $logfile)

是否相当于:

代码语言:javascript
运行
复制
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上打开的--然后再进行重定向:

代码语言:javascript
运行
复制
exec 3>&1 4>&2 > >(tee -a -- "$logfile") 2>&1

3>&1执行dup2(1, 3)的情况下,fd 3现在指向与fd 1相同的打开文件描述。

为了撤销,

代码语言:javascript
运行
复制
exec >&3 2>&4 3>&- 4>&-

或者运行someapp时,它的stdout和stderr是原始的stdout和stderr:

代码语言:javascript
运行
复制
someapp >&3 2>&4 3>&- 4>&- &
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/731516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档