如何将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,您还有以下几种选择:

  1. 将stdout重定向到一个文件,将stderr重定向到另一个文件:

     command > out 2>error 
  2. 将stderr重定向到stdout( &1 ),然后将stdout重定向到文件:

     command >out 2>&1 
  3. 将两者重定向到文件:

     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/nullecho Hello World 1>/dev/null 。 请注意,不能引用整数或重定向运算符,否则shell不会识别它们,而是将其视为文本字符串。 至于间距,重要的是整数紧挨着重定向运算符,但是文件可以在重定向操作符旁边,即command 2>/dev/nullcommand 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