一尘不染

使用`exec 1> file`后,如何停止将STDOUT重定向到文件并恢复STDOUT的正常运行?

linux

我是shell脚本的新手,并且正在使用Ubuntu-11.10。在使用exec 1>file命令后的终端中,无论我向终端发出什么命令,其输出都不会显示在终端中。我知道STDOUT将被重定向到文件,这些命令的输出将被重定向到文件。

我的问题在这里

  1. 使用后exec 1>file,如何摆脱这种情况?即如何停止STDOUT重定向到文件并恢复STDOUT的正常操作(即重定向到终端而不是文件)?

我尝试使用,exec 1>&-但由于这关闭了STDOUT文件描述符,因此无法正常工作。

  1. 请说明exec 1>file和的整个操作exec 1>&-

  2. 如果使用来关闭标准文件描述符0、1、2,会发生什么exec 0>&- exec 1>&- exec 2>&-


阅读 375

收藏
2020-06-07

共1个答案

一尘不染

Q1

在执行初始操作之前,您必须准备恢复exec

exec 3>&1 1>file

要稍后恢复原始标准输出:

exec 1>&3 3>&-

第一个exec将原始文件描述符1(标准输出)复制到文件描述符3,然后将标准输出重定向到命名文件。第二个exec再次将文件描述符3复制到标准输出,然后关闭文件描述符3。

Q2

这有点开放。可以在C代码级别或Shell命令行级别对其进行描述。

exec 1>file

只需将shell的标准输出(1)重定向到命名文件。文件描述符现在引用命名的文件;写入标准输出的所有输出都将进入该文件。(请注意,交互式外壳程序中的提示被写入标准错误,而不是标准输出。)

exec 1>&-

只需关闭外壳的标准输出即可。现在没有用于标准输出的打开文件。如果程序在没有标准输出的情况下运行,则可能会感到不高兴。

Q3

如果关闭标准输入,标准输出和标准错误的所有三个,则交互式外壳将在您关闭标准输入时退出(因为它在读取下一个命令时将得到EOF)。Shell脚本将继续运行,但是它运行的程序可能会感到烦躁,因为可以确保它们具有3个打开的文件通道-
标准输入,标准输出,标准错误-并且当您的Shell运行它们时,如果没有其他I /
O重定向,那么它们将无法获得承诺的文件通道,并且可能会崩溃(并且您唯一会知道的是,命令的退出状态可能不会为零,即成功)。

2020-06-07