我是shell脚本的新手,并且正在使用Ubuntu-11.10。在使用exec 1>file命令后的终端中,无论我向终端发出什么命令,其输出都不会显示在终端中。我知道STDOUT将被重定向到文件,这些命令的输出将被重定向到文件。
exec 1>file
我的问题在这里
我尝试使用,exec 1>&-但由于这关闭了STDOUT文件描述符,因此无法正常工作。
exec 1>&-
请说明exec 1>file和的整个操作exec 1>&-
如果使用来关闭标准文件描述符0、1、2,会发生什么exec 0>&- exec 1>&- exec 2>&-?
exec 0>&-
exec 2>&-
在执行初始操作之前,您必须准备恢复exec:
exec
exec 3>&1 1>file
要稍后恢复原始标准输出:
exec 1>&3 3>&-
第一个exec将原始文件描述符1(标准输出)复制到文件描述符3,然后将标准输出重定向到命名文件。第二个exec再次将文件描述符3复制到标准输出,然后关闭文件描述符3。
这有点开放。可以在C代码级别或Shell命令行级别对其进行描述。
只需将shell的标准输出(1)重定向到命名文件。文件描述符现在引用命名的文件;写入标准输出的所有输出都将进入该文件。(请注意,交互式外壳程序中的提示被写入标准错误,而不是标准输出。)
只需关闭外壳的标准输出即可。现在没有用于标准输出的打开文件。如果程序在没有标准输出的情况下运行,则可能会感到不高兴。
如果关闭标准输入,标准输出和标准错误的所有三个,则交互式外壳将在您关闭标准输入时退出(因为它在读取下一个命令时将得到EOF)。Shell脚本将继续运行,但是它运行的程序可能会感到烦躁,因为可以确保它们具有3个打开的文件通道- 标准输入,标准输出,标准错误-并且当您的Shell运行它们时,如果没有其他I / O重定向,那么它们将无法获得承诺的文件通道,并且可能会崩溃(并且您唯一会知道的是,命令的退出状态可能不会为零,即成功)。