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

在使用`exec 1> file`后,如何停止STDOUT的redirect到文件并恢复STDOUT的正常运行?,第1张

概述在使用`exec 1> file`后,如何停止STDOUT的redirect到文件恢复STDOUT的正常运行?

我是shell脚本的新手,我使用的是Ubuntu 11.10。 在terminal使用exec 1>file命令后,无论我给terminal的命令是什么,它的输出都不会显示在terminal上。 我知道STDOUT被redirect到文件,这些命令的输出被redirect到文件。

我的问题在这里

一旦我使用exec 1>file ,我该如何摆脱这个? 即如何停止STDOUTredirect到文件并恢复STDOUT的正常 *** 作(即redirect到terminal,而不是文件)?

我尝试使用exec 1>&-但它不起作用,因为这closures了STDOUT文件描述符。

硬盘温度不会通过网页显示

如何通过Java代码在linux上运行超级用户命令?

fork-execpipe道redirect问题

系统()后获取子PID

将Perl脚本作为具有特定名称的进程产生

请详细介绍exec 1>file和exec 1>&-全部 *** 作,

如果我们使用exec 0>&- exec 1>&- exec 2>&-closures标准文件描述符0,1,2,会发生什么?

为以exec开头的进程设置自定义工作目录

使用TCL和FFMPEG,在for循环中运行2个exec命令,时间间隔为30秒

bash / scp如何扩展“远程”全局模式?

为什么程序在这个C编程或unix编程(execvp()系统调用)中没有执行一些句子?

什么会导致exec失败? 接下来发生什么?

Q1 @H_502_34@

在执行初始exec之前,您必须为恢复做好准备:

exec 3>&1 1>file

稍后恢复原始标准输出:

exec 1>&3 3>&-

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

Q2 @H_502_34@

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

exec 1>file

只需将shell的标准输出(1)重定向到指定的文件即可。 文件描述符现在引用指定的文件; 写入标准输出的任何输出都将转到该文件。 (请注意,交互式shell中的提示会写入标准错误,而不是标准输出。)

exec 1>&-

只需关闭shell的标准输出。 现在没有标准输出的打开文件。 如果程序运行时没有标准输出,程序可能会感到不安。

Q3 @H_502_34@

如果关闭标准输入,标准输出和标准错误的全部三个,交互式shell将在关闭标准输入时退出(因为在读取下一个命令时将会收到EOF)。 一个shell脚本将继续运行,但它运行的程序可能会感到不安,因为它们保证了3个打开的文件通道 – 标准输入,标准输出,标准错误 – 当你的shell运行它们,如果没有其他的I / O重定向,那么他们没有得到他们承诺的文件通道,所有的地狱都可能破裂(唯一的方法就是你知道命令的退出状态可能不会是零 – 成功)。

问题1 :有一个简单的方法可以在将终端重定向到一个文件后将stdout恢复到终端:

exec >/dev/tty

虽然保存原始的stdout文件描述符通常需要稍后恢复,在这种情况下,您希望stdout是/dev/tty因此不需要做更多的事情。

$ date Mon Aug 25 10:06:46 CEST 2014 $ exec > /tmp/foo $ date $ exec > /dev/tty $ date Mon Aug 25 10:07:24 CEST 2014 $ ls -l /tmp/foo -rw-r--r-- 1 jlliagre jlliagre 30 Aug 25 10:07 /tmp/foo $ cat /tmp/foo Mon Aug 25 10:07:05 CEST 2014

问题2 : exec 1>file是一个稍微更详细的方式做exec >file ,如前所述,重定向标准输出到给定的文件,只要你有权创建/写入它。 如果该文件不存在,则会创建该文件,如果该文件被截断,则会被截断。

exec 1>&-正在关闭标准输出,在大多数情况下这可能是一个坏主意。

Q3 :命令应该是

exec 0<&- exec 1>&- exec 2>&-

请注意stdin的反向重定向。

可能会这样简化:

exec <&- >&- 2>&-

这个命令关闭所有三个标准文件描述符。 这是一个非常糟糕的主意。 如果你想要一个脚本从这些渠道断开,我会建议这个更强大的方法:

exec </dev/null >/dev/null 2>&1

在这种情况下,所有的输出将被丢弃,而不是触发错误,所有的输入将只返回任何东西,而不是失败。

虽然我完全同意Jonathan的Q1,但有些系统具有/dev/stdout ,所以你可能可以执行exec 1>file; ...; exec 1>/dev/stdout exec 1>file; ...; exec 1>/dev/stdout

接受的答案对我来说太冗长了。 所以,我决定总结一下你原来的答案。

使用Bash版本4.3.39(2) – 释放

在Cygwin机器上的x86 32位上

已知: @H_502_34@

Stdin是fd#0。

标准输出是fd#1。

斯德尔是fd#2。

回答(用bash写): @H_502_34@

exec 1> ./output.test.txt echo -e "First line: Hello World!" printf "%sn" "2nd line: Hello Earth!" "3rd line: Hello Solar System!" # This is uneccessary,but # it stops or closes stdout. # exec 1>&- # Send stdout back to stdin exec 1>&0 # Oops... I need to append some more data. # So,lets append to the file. exec 1>> ./output.test.txt echo -e "# Appended this line and the next line is empty.n" # Send stdout back to stdin exec 1>&0 # Output the contents to stdout cat ./output.test.txt

有用的关键字: @H_502_34@

Bourne,Bash,tcsh,linux,BSD,AIX,HP,BusyBox,ToyBox等中的IO重定向还有here-docs,here-strings和process-substitution。

总结

以上是内存溢出为你收集整理的在使用`exec 1> file`后,如何停止STDOUT的redirect到文件并恢复STDOUT的正常运行?全部内容,希望文章能够帮你解决在使用`exec 1> file`后,如何停止STDOUT的redirect到文件并恢复STDOUT的正常运行?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1285610.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存