恢复 stdout 和 stderr 到默认值。

12
在shell脚本中,我们可以使用exec命令将默认输入更改为文件,如下所示:
  exec 1>outputfile

但是,如果在同一个脚本中我想要将stdout描述符“1”恢复为默认值(终端)。我们该如何实现?


2
exec &>/dev/tty 的意思是将标准输出和标准错误输出重定向到当前终端。 - enharmonic
2个回答

15

这个例子

例20-2. 使用exec重定向stdout

#!/bin/bash
# reassign-stdout.sh

LOGFILE=logfile.txt

exec 6>&1           # Link file descriptor #6 with stdout.
                    # Saves stdout.

exec > $LOGFILE     # stdout replaced with file "logfile.txt".

# ----------------------------------------------------------- #
# All output from commands in this block sent to file $LOGFILE.

echo -n "Logfile: "
date
echo "-------------------------------------"
echo

echo "Output of \"ls -al\" command"
echo
ls -al
echo; echo
echo "Output of \"df\" command"
echo
df

# ----------------------------------------------------------- #

exec 1>&6 6>&-      # Restore stdout and close file descriptor #6.

echo
echo "== stdout now restored to default == "
echo
ls -al
echo

exit 0

看起来展示了你想要的内容。它来自ABS,其中有少量讨论和其他相关信息。


在上面的例子中,你能解释一下我们是从哪里获取文件描述符'6'的吗? - Naved Alam
1
正如我所指出的文档中提到的那样,shell实际上为此提供了10个编号的文件描述符,其中前三个分配给标准输入、标准输出和标准错误。它还指出,有一些很好的理由不要使用“5”,因为这个文件描述符会被子进程继承。http://www.tldp.org/LDP/abs/html/io-redirection.html#FTN.AEN17823 - GreenAsJade
2
好的,我明白了。我们将默认的STDOUT存储在6中,然后从6中恢复它。这正是我一直在寻找的。此外,您在评论中提供的链接也非常有帮助。谢谢。 - Naved Alam
ABS不是一个很好的参考。这个答案是正确的,但也许它可以链接到一个更权威和/或可靠的来源。 - tripleee
这个链接并不是用来作为权威备份的,而是为了表明我获取信息的来源。实际上,我认为并不需要一个“权威”的或者“可靠”的来源。它要么有效,要么无效 :). 现在这个问题可能已经没有意义了,因为链接似乎已经失效了(这至少证实了你对它的评估 :) )。 - GreenAsJade

-2
尝试使用“tee”命令:
exec | tee outputfile

请查看tee的man页面以获取更多解释:

tee-从标准输入读取并将内容写入标准输出和文件


请解释你的答案。提供一些参考,说明你为什么这样建议。 - 0xF1
2
你提出的建议是将相同的输出重定向到STDOUT和outfile文件。然而,这与将STDOUT恢复为默认值没有任何关系。 - Naved Alam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接