如何将stderr重定向到文件
使用nohup命令在后台运行时,一些内容出现在终端中。
cp: error reading '/mnt/tt/file.txt': Input/output error cp: failed to extend '/mnt/tt/file.txt': Input/output error
我想将该内容保存到文件中。
Linux(和其他操作系统)有两个主要输出流,标准输出(stdout)和标准错误(stderr)。 错误消息(如您显示的消息)将打印为标准错误。 经典重定向运算符( command > file
)仅重定向标准输出,因此终端上仍会显示标准错误。 要重定向stderr,您还有以下几种选择:
-
将stdout重定向到一个文件,将stderr重定向到另一个文件:
command > out 2>error
-
将stderr重定向到stdout(
&1
),然后将stdout重定向到文件:command >out 2>&1
-
将两者重定向到文件:
command &> out
有关各种控制和重定向运算符的更多信息,请参见此处 。
首先要注意的是,有几种方法取决于你的目的和shell,因此这需要对多个方面略有理解。 最典型的是,通过2>
在类似Bourne的shell中 ,例如dash
(符号链接到/bin/sh
)和bash
; 第一个是默认和POSIX兼容的shell,另一个是大多数用户用于交互式会话的。 它们的语法和function不同,但幸运的是我们错误流重定向的工作方式相同(除非&>
非标准的)。 在csh及其衍生物的情况下,stderr重定向在那里不起作用。
让我们回到2>
部分。 需要注意两个关键事项: >
表示重定向运算符,我们打开一个文件, 2
整数代表stderr文件描述符; 事实上,这正是shell语言的POSIX标准如何定义2.7节中的重定向:
[n]redir-op word
对于简单>
重定向, stdout
隐含1
整数,即echo Hello World > /dev/null
与echo Hello World 1>/dev/null
。 请注意,不能引用整数或重定向运算符,否则shell不会识别它们,而是将其视为文本字符串。 至于间距,重要的是整数紧挨着重定向运算符,但是文件可以在重定向操作符旁边,即command 2>/dev/null
和command 2> /dev/null
将正常工作。
shell中典型命令的稍微简化的语法是
command [arg1] [arg2] 2> /dev/null
这里的诀窍是重定向可以出现在任何地方。 这是2> command [arg1]
和command 2> [arg1]
都有效。 请注意,对于bash
shell,存在&>
方法同时重定向stdout和stderr流,但是再次 – 它是特定于bash的,如果你正在努力实现脚本的可移植性,它可能无效。 另请参阅Ubuntu Wiki和&>和2>&1之间的区别 。
注意: >
重定向运算符会截断文件并覆盖它(如果文件存在)。 2>>
可用于将stderr
附加到文件。
如果您注意到, >
仅用于一个命令。 对于脚本,我们可以像在myscript.sh 2> /dev/null
那样从外部重定向整个脚本的stderr流,或者我们可以使用内置的exec 。 内置的exec有能力为整个shell会话重新连接流,可以说是交互式还是通过脚本。 就像是
#!/bin/sh exec 2> ./my_log_file.txt stat /etc/non_existing_file
在此示例中,日志文件应显示stat: cannot stat '/etc/non_existing_file': No such file or directory
。
另一种方式是通过function。 正如kopciuszek在他的回答中指出的那样,我们可以用已经附加的重定向来编写函数声明,即
some_function(){ command1 command2 } 2> my_log_file.txt