Answers:
cmd >>file.txt 2>&1
Bash执行从左到右的重定向,如下所示:
>>file.txt
:file.txt
以追加模式打开并在stdout
那里重定向。2>&1
:重定向stderr
到“ stdout
当前要去哪里”。在这种情况下,这是在附加模式下打开的文件。换句话说,&1
重用stdout
当前使用的文件描述符。cmd >>file1 2>>file2
,应该可以实现您想要的。
有两种方法可以执行此操作,具体取决于您的Bash版本。
经典且可移植(Bash pre-4)的方式是:
cmd >> outfile 2>&1
从Bash 4开始的一种非便携式方式是
cmd &>> outfile
(模拟到&> outfile
)
为了获得良好的编码风格,您应该
如果您的脚本已经以#!/bin/sh
(无论是否有意)开头,那么Bash 4解决方案(通常是任何特定于Bash的代码)就不可行了。
还请记住,Bash 4 &>>
只是较短的语法-它没有引入任何新功能或类似功能。
语法(除其他重定向语法外)在此处描述:http : //bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output
sh
。您可以通过添加SHELL=/bin/bash
到crontab -e
文件来更改默认Shell 。
在Bash中,您还可以显式指定重定向到其他文件:
cmd >log.out 2>log_error.out
追加为:
cmd >>log.out 2>>log_error.out
cmd >log.out 2>&1
。我正在编辑我的答案以删除第一个示例。
在Bash 4(以及ZSH 4.3.11)中:
cmd &>>outfile
开箱即用
这应该工作正常:
your_command 2>&1 | tee -a file.txt
它将所有日志存储在file.txt中,并将其转储到终端上。
尝试这个
You_command 1>output.log 2>&1
您对&> x.file的用法确实可以在bash4中使用。对此表示抱歉:(
0、1、2 ... 9是bash中的文件描述符。
0代表stdin
,1代表stdout
,2代表stderror
。3〜9可用于其他任何临时用途。
可以使用运算符>
或>>
(附加)将任何文件描述符重定向到其他文件描述符或文件。
用法:< 类file_descriptor > > < 文件名 | &file_descriptor >
You_command
到stdout,并将stdout 重定向You_command
到file output.log
。此外,它不会追加到文件中,但会覆盖它。
1 > output.log 2>&1
令我惊讶的是,近十年来,还没有人发布这种方法:
如果使用的bash较旧版本&>>
不可用,您还可以执行以下操作:
(cmd 2>&1) >> file.txt
这产生一个子shell,所以它比传统方法效率较低cmd >> file.txt 2>&1
,并因此会为命令是需要修改目前的外壳不工作(例如cd
,pushd
),但这种方法感觉更自然和可以理解的对我说:
同样,括号消除了任何歧义的顺序,特别是如果您想将stdout和stderr用管道传递给另一个命令时,尤其如此。
cmd >> file 2>&1
可在所有Shell中使用,并且不需要额外的进程即可运行。