【问题标题】:How to easily put all echo statements in a shell script into a log file如何轻松地将 shell 脚本中的所有 echo 语句放入日志文件中
【发布时间】:2018-10-11 00:40:14
【问题描述】:

我有一个 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

【问题讨论】:

  • 你想在这里保存什么?减少行数?大概定义一个函数并将参数作为字符串传递到文件中并使用参数调用函数?
  • 好的。创建方法也应该有效。但我想知道在 shell 脚本中有一个标准的方法来处理这个

标签: linux bash shell sh


【解决方案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

请注意,这些方法不再为每次写入重新打开日志 - 如果您重命名日志文件,输出将继续转到它,而在原始文件中,后续输出将在一个新文件中结束名字。

【讨论】:

    【解决方案2】:

    您可以在子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,但我想你明白了。)

    【讨论】:

    • 啊。这也是我正在寻找的一个很好的技术。非常感谢
    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2019-06-26
    • 2012-04-13
    • 1970-01-01
    相关资源
    最近更新 更多