linux stdout/stderr重定向到文件,>或tee
正常情况下直接使用 '>'或者tee命令只能把stdout的终端输出重定向到文件中,而stderr的输出是无法写到文件中的。
比如在使用svn up时遇到svn 报错的错误,svn ERROR/WARNING
用下面的语句是不会将ERROR/WARNING行写到svn.log的
svn up | tee svn.log
要想同时将这两类输出都写到文件中,可以如下操作
1. 使用 2>
或 2>>
重定向符号
- 覆盖重定向:
command 2> error.log
上述命令将 command
的标准错误输出重定向到名为 error.log
的文件中。如果 error.log
已经存在,原有的内容将被覆盖。
- 追加重定向:
command 2>> error.log
此命令将 command
的标准错误输出追加到 error.log
文件的末尾,不会覆盖原有的内容。
2. 同时重定向标准输出和标准错误
- 使用
&>
或>&
符号(适用于 bash):
command &> output.log
或者
command > output.log 2>&1
这两个命令的效果相同,都将 command
的标准输出和标准错误输出同时重定向到 output.log
文件中。
- 使用
tee
命令:
command 2>&1 | tee output.log
tee
命令将标准输出同时输出到屏幕和文件中。在上述示例中,先将标准错误输出重定向到标准输出(2>&1
),然后使用 tee
命令将合并后的输出输出到屏幕和 output.log
文件中。
3. 分离标准输出和标准错误到不同文件
- 同时使用
>
和2>
:
command > output.log 2> error.log
此命令将 command
的标准输出重定向到 output.log
文件,同时将标准错误输出重定向到 error.log
文件。
4. 在脚本中使用重定向
以下是一个简单的示例脚本,将标准错误输出重定向到文件:
#!/bin/bash
# 尝试执行一个会产生错误的命令
ls non_existent_file 2> error.log
echo "This is the end of the script"
在上述脚本中,ls non_existent_file
会产生一个错误,因为文件不存在,该错误将被重定向到 error.log
文件中,而后续的 echo
语句正常输出到标准输出。
5. 结合管道和重定向
- 将标准错误通过管道传递并最终重定向到文件:
command 2>&1 | grep "error" > error.log
此命令将 command
的标准错误和标准输出合并,通过管道传递给 grep
命令,然后将包含 “error” 的行重定向到 error.log
文件中。
解释和使用注意事项
-
重定向符号说明:
>
表示覆盖重定向,将输出覆盖到指定文件。>>
表示追加重定向,将输出添加到文件末尾。2>
专门用于重定向标准错误。2>>
是标准错误的追加重定向。&>
或>&
是同时重定向标准输出和标准错误。
-
使用场景示例:
- 当你只想查看命令的错误信息时,使用
2>
或2>>
可以将错误信息单独存储,方便后续分析错误。 - 在脚本编写中,将错误信息和正常输出分开可以更清晰地管理输出,例如将错误信息存储在
error.log
中,将正常输出存储在output.log
中。
- 当你只想查看命令的错误信息时,使用
通过以上方法,你可以根据不同的需求将标准错误输出重定向到文件,方便对命令的执行结果进行管理和分析。