当前位置: 首页 > 面试题库 >

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

唐康安
2023-03-14
问题内容

我是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>&-


问题答案:

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重定向,那么它们将无法获得承诺的文件通道,并且可能会崩溃(并且您唯一会知道的是,命令的退出状态可能不会为零,即成功)。



 类似资料:
  • 问题内容: 我在cyberciti.biz的评论中看到了这个有趣的问题。 我发现我什至找不到在sh的单行命令中执行此操作的灵活方法。 到目前为止,我对解决方案的想法是: 但是您会看到,这不是同步的,而且致命的是,它是如此丑陋。 欢迎与您分享这个想法。:) 问题答案: 你要 这里的顺序很重要。假设stdin(fd 0),stdout(fd 1)和stderr(fd 2)最初都连接到tty,因此 首先

  • 问题内容: 要将 stdout 重定向到Bash中的截断文件,我知道使用: 为了重定向Bash中的 stdout ,将其附加到文件中,我知道要使用: 要将 stdout 和 stderr 都重定向到截断的文件,我知道使用: 如何将 stdout 和 stderr 都重定向到文件?没有为我工作。 问题答案: Bash执行从左到右的重定向,如下所示: :以追加模式打开并在那里重定向。 :重定向到 “当

  • 问题内容: 如何在Python中将stdout重定向到任意文件? 当从ssh会话中启动运行了很长时间的Python脚本(例如,Web应用程序)并进行背景调整,并且ssh会话关闭时,该应用程序将在尝试写入stdout时引发并失败。我需要找到一种方法来使应用程序和模块输出到文件而不是stdout,以防止由于而导致失败。当前,我使用将输出重定向到文件,并且可以完成工作,但是我想知道是否有一种出于好奇而无

  • 问题内容: 我正在尝试将函数的标准输出重定向到tkinter文本小部件。我遇到的问题是,它会将每一行写到一个新窗口中,而不是将所有内容都列出在一个窗口中。该函数扫描目录并列出任何0k文件。如果没有文件为0k,则将其打印出来。因此,问题在于,如果目录中有30个0k文件,它将打开30个窗口,每个窗口只有一行。现在,我知道问题出在哪里。如果您查看我的功能代码,我会告诉您: 我知道,每次os.stat看到

  • 问题内容: 我有一个连接到Twitter Firehose并将其向下游发送数据进行处理的python脚本。在此之前,它可以正常工作,但是现在,我正在尝试仅获取文本正文。(这不是我应该如何从Twitter提取数据或如何编码/解码ascii字符的问题)。因此,当我像这样直接启动脚本时: 它工作正常,我可以看到消息正在显示在屏幕上。例如: 但是,如果我尝试将它们输出到文件中,如下所示: 愚蠢地抛出我和错

  • 问题内容: 我有一个cron作业,现在将其输出重定向到文件中。看起来如下 有人可以帮助我将其输出重新分配到stdout吗? 问题答案: 在任何终端上输入,我们将获得该特定终端窗口的设备文件,例如。将cron作业重新命名为该文件