如何在Linux/Unix下将终端输出保存到文件

时间:2020-01-09 10:39:40  来源:igfitidea点击:

在Linux,macOS,* BSD或类似Unix的操作系统上使用BASH/KSH/CSH/TCSH时,如何将终端输出保存到文件中?
是的,我们可以通过将命令输出重定向到文件来保存命令输出。
输入,输出和错误的标准流如下(也称为文件描述符):

  • stdin标准输入(数值0)键盘
  • stdout标准输出(数值1)屏幕/显示
  • stderr标准错误(数值2)屏幕/显示

所以1代表stdout,2代表stderr。
根据这些信息,我们可以:

  • 将stdout/stderr重定向到文件
  • 将stdout重定向到stderr或将stderr重定向到stdout
  • 将stderr和stdout重定向到文件
  • 我们也可以将stderr和stdout重定向到stdout
  • 最后,您可以将stderr和stdout重定向到stderr

如何将终端输出保存到文件

默认情况下,该命令将输出发送到stdout,并且可以使用以下语法将其重定向到文件:

command > filename.txt

例如,将date命令输出保存到名为mydate.txt的文件中,运行:

date > mydate.txt

要查看包含的文件,请使用cat命令:

cat mydate.txt

向我们的命令提供数据(输入重定向)

我们可以使用以下简单语法从文件中读取输入,并且该文件必须已经存在:

command < input.txt
cat < /etc/passwd
wc -l < /etc/passwd

将输出追加到文件

如果filename.txt/mydate.txt(文件)已经存在,它将被覆盖。
要追加输出,请运行:

command >> filename.txt
echo "------------------" >> mydate.txt
ls -l /etc/resolv.conf >> mydate.txt

验证一下:

cat mydate.txt

请注意,除非使用set命令设置bash noclobber选项,否则将覆盖mydate.txt之类的文件。
例如,关闭noclobber选项:

set -o noclobber
echo "some data" > mydata.txt

输出示例:

bash: mydata.txt: cannot overwrite existing file

我们可以如下所示打开noclobber选项:

set +o noclobber
echo "foo bar" > mydata.txt

如何将stderr重定向到文件

语法如下:

command &> file.txt
command &>> file.txt

或者

command 2> file.txt
command 2>> file.txt

以上与bash和其他现代shell一起使用。
对于POSIX版本,请尝试:

command >output.txt 2>&1
command >>output.txt 2>&1

在此示例中,将find命令错误发送到名为err.log的文件:

find / -iname "*.conf" &>err.log
## 或者
find / -iname "*.conf" 2>err.log
## POSIX version ##
find . -iname "*.conf" >err.log 2>&1

验证一下:

cat err.log

输出示例:

find: ?./snap.chromium?: Permission denied
find: ?./systemd-private-timesyncd.service-KOh0jg?: Permission denied
find: ?./snap.demo?: Permission denied
find: ?./snap.lxd?: Permission denied
find: ?./.vbox-root-ipc?: Permission denied

如何抑制错误消息

使用以下语法:

command 2>&
find . -iname "*.txt" 2>&

我们还可以将错误消息(stderr)重定向到标准输出(stdout),运行:

command 2>&1
echo "foo" 2>&1
kill $target_pid 2>&1 > /dev/null

如何将stdout和stderr都重定向到文件

语法如下,将stdout和stderr都重定向到文件:

command 2>&1 | tee output.txt

例如:

find . -iname "*.txt" 2>&1 | tee cmd.log
cat cmd.log

要将文本追加到文件末尾,请使用以下语法:

find . -iname "*.conf" 2>&1 | tee -a cmd.log
cat cmd.log

如何合并重定向

以下命令示例仅将输入和输出重定向合并在一起。
检查文件resume.txt中是否存在拼写错误,并将输出重定向到名为err.log的错误日志文件:

spell < resume.txt > error.log

如何将屏幕输出(stdout)和错误(stderr)重定向到/dev/null

尝试以下语法

command > /dev/null 2>&1
/path/to/script.py > /dev/null 2>&1

将标准错误和标准输出消息都重定向到日志文件

command > log.txt 2>&1
/path/to/my-appname.py > my-appname.log 2>&1