要将标准输出重定向到Bash中的截断文件,我知道要使用:
cmd > file.txt
要重定向Bash中的标准输出,将其附加到文件,我知道要使用:
cmd >> file.txt
要将标准输出和标准错误重定向到截断的文件,我知道可以使用:
cmd &> file.txt
如何将标准输出和标准错误附加重定向到文件?cmd&>>file.txt对我不起作用。
要将标准输出重定向到Bash中的截断文件,我知道要使用:
cmd > file.txt
要重定向Bash中的标准输出,将其附加到文件,我知道要使用:
cmd >> file.txt
要将标准输出和标准错误重定向到截断的文件,我知道可以使用:
cmd &> file.txt
如何将标准输出和标准错误附加重定向到文件?cmd&>>file.txt对我不起作用。
当前回答
有两种方法可以做到这一点,具体取决于您的Bash版本。
经典的便携(Bash pre-4)方式是:
cmd >> outfile 2>&1
从Bash 4开始的一个不可移植的方法是
cmd &>> outfile
(模拟输出文件)
为了获得良好的编码风格,您应该
决定是否需要考虑可移植性(然后使用经典方法)决定是否需要考虑Bash pre-4的可移植性(然后使用经典方法)无论使用哪种语法,都不要在同一个脚本中更改它(混淆!)
如果脚本已经以#/bin/sh(无论是否有意),那么Bash 4解决方案以及任何Bash特定的代码都是不可行的。
还要记住,Bash 4&>>只是一个较短的语法,它没有引入任何新功能或类似的东西。
该语法(除其他重定向语法外)在Bash hackers wiki中进行了描述。
其他回答
在Bash中,您还可以明确指定指向不同文件的重定向:
cmd >log.out 2>log_error.out
附录应为:
cmd >>log.out 2>>log_error.out
这应该很好:
your_command 2>&1 | tee -a file.txt
它会将所有日志存储在file.txt中,并将其转储到终端中。
在Bash 4(以及Z外壳(zsh)4.3.11)中:
cmd &>> outfile
只是开箱即用。
有两种方法可以做到这一点,具体取决于您的Bash版本。
经典的便携(Bash pre-4)方式是:
cmd >> outfile 2>&1
从Bash 4开始的一个不可移植的方法是
cmd &>> outfile
(模拟输出文件)
为了获得良好的编码风格,您应该
决定是否需要考虑可移植性(然后使用经典方法)决定是否需要考虑Bash pre-4的可移植性(然后使用经典方法)无论使用哪种语法,都不要在同一个脚本中更改它(混淆!)
如果脚本已经以#/bin/sh(无论是否有意),那么Bash 4解决方案以及任何Bash特定的代码都是不可行的。
还要记住,Bash 4&>>只是一个较短的语法,它没有引入任何新功能或类似的东西。
该语法(除其他重定向语法外)在Bash hackers wiki中进行了描述。
另一种方法:
如果在&>>不可用的地方使用旧版本的Bash,您还可以执行以下操作:
(cmd 2>&1) >> file.txt
这产生了一个子shell,因此它的效率低于传统的cmd>>file.txt 2>&1方法,因此它不适用于需要修改当前shell的命令(例如cd、pushd),但这种方法对我来说更自然、更容易理解:
将标准错误重定向到标准输出。通过附加到文件来重定向新的标准输出。
此外,括号消除了顺序的任何歧义,特别是如果您希望将标准输出和标准错误传输到另一个命令。
为了避免启动子shell,您可以使用大括号代替括号来创建组命令:
{ cmd 2>&1; } >> file.txt
(请注意,终止组命令需要分号(或换行符)。)