如何将错误重定向到文件?

ron*_*nie 5 bash stdout stderr

我有这个简单的脚本,它将输出和append它重定向到一个文件。

filename="/home/ronnie/tmp/hello"

date=$(date)
echo "$date" >> $filename
Run Code Online (Sandbox Code Playgroud)

现在,假设我更改date=$(date)date= $(date)哪个会产生错误。

我修改后的脚本:

filename="/home/ronnie/tmp/hello"

date= $(date)
echo "$date" >> $filename 2>> $filename 
#Also tried echo "$date" >> $filename 2>&1
Run Code Online (Sandbox Code Playgroud)

我在想上面的脚本会将错误重定向test.sh: line 5: Fri: command not found到文件,hello但它只是在文件中输入一个新行,错误会打印在我的stdout.

我的 bash 版本:

ronnier@ronnie:~/tmp$ bash --version
GNU bash, version 4.2.24(1)-release (i686-pc-linux-gnu)
Run Code Online (Sandbox Code Playgroud)

那么,我哪里出错了。

Eig*_*ony 9

导致错误的行是date =$(date),该错误被发送到 stderr。在那个阶段,您不会在任何地方重定向 stderr。后续行将 stderr 发送到 $filename,但不是导致错误的那一行。

获得您想要的效果的方法之一,您可以运行您的脚本并同时将 stderr 定向到其他地方,因此,

./myscript 2>> errors.txt
Run Code Online (Sandbox Code Playgroud)

此时,errors.txt 将包含您的错误。

所以问题是,生成错误的行是脚本本身的错误,而不是由脚本调用的外部命令导致的错误,该命令将其输出重定向。即它是您需要重定向的顶级脚本输出。