如何轻松地将Shell脚本中的所有echo语句放入日志文件

时间:2018-10-10 09:48:09

标签: linux bash shell sh

我有一个shell脚本,该脚本在逻辑中的某些重要位置进行回显。每次执行回显时,我都会通过执行>> /some/location/my_logtxt将日志附加到日志文件中。

逻辑如下所示

ret=123
echo Something happened $ret >> /some/location/my_logtxt

// some logic 
echo Something else happened $ret >> /some/location/my_logtxt

// some more logic 

echo Something else happened again $ret >> /some/location/my_logtxt

问题:

难道没有一个语句可以声明所有echo语句日志都进入以下文件,而不是对每个>> /some/location/my_logtxt执行此echo吗?

2 个答案:

答案 0 :(得分:1)

如果您希望所有输出 转到日志文件,则可以使用exec进行重定向:

exec >> "$logfile"

您也可能希望重定向stderr:2>&1


如果只希望重定向echo命令,则可以为此连接未使用的流(大于2):

exec 3>> "$logfile"

ret=123
echo "Something happened $ret" >&3

# some logic 
echo "Something else happened $ret" >&3

请注意,这些方法不再为每次写入重新打开日志-如果您重命名日志文件,则输出将继续进入该日志文件,而在原始日志中,后续输出最终将在旧文件的新文件中结束名称。

答案 1 :(得分:1)

您可以将您的内容放在子shell中,并重定向子shell的输出:

(
    ret=123
    echo Something happened "$ret"
    // some logic 
    echo Something else happened "$ret"
    // some more logic 
    echo Something else happened again "$ret"
) >> /some/location/my_logtxt

如果您只想影响自己的echo语句,我建议改用myecho语句:

myecho() {
    echo "$@" >> /some/location/my_logtxt
}

ret=123
myecho Something happened "$ret"
// some logic 
myecho Something else happened "$ret"
// some more logic 
myecho Something else happened again "$ret"

(更合适的名称可能像log而不是myecho,但我想你明白了。)