2023-03-22 10:00:09

输出到stderr的echo

是否有一个标准的Bash工具,其行为类似于echo,但输出到stderr而不是stdout?

我知道我可以做echo foo 1>&2,但它有点难看,而且,我怀疑,容易出错(例如,当事情发生变化时,更容易编辑错误)。


当前回答

另一种选择

echo foo >>/dev/stderr

其他回答

如果您不介意将消息也记录到syslog,那么not_so_丑陋的方法是:

logger -s $msg

-s选项表示:“将消息输出到标准错误和系统日志。”

由于1是标准输出,因此不必在输出重定向前显式命名它,如>。相反,您可以简单地键入:

echo This message goes to stderr >&2

由于您似乎担心1>&2对您来说很难可靠地打字,因此删除多余的1可能会对您有一点鼓励!

另一种选择

echo foo >>/dev/stderr

这里有一个函数用于检查最后一个命令的退出状态,显示错误并终止脚本。

or_exit() {
    local exit_status=$?
    local message=$*

    if [ "$exit_status" -gt 0 ]
    then
        echo "$(date '+%F %T') [$(basename "$0" .sh)] [ERROR] $message" >&2
        exit "$exit_status"
    fi
}

用法:

gzip "$data_dir"
    or_exit "Cannot gzip $data_dir"

rm -rf "$junk"
    or_exit Cannot remove $junk folder

该函数打印脚本名称和日期,以便在从crontab调用脚本并记录错误时有用。

59 23 * * * /my/backup.sh 2>> /my/error.log

你可以这样做,这有助于阅读:

>&2 echo "error"

>&2将文件描述符#2复制到文件描述符#1。因此,执行此重定向后,两个文件描述符将引用同一个文件:最初引用的是一个文件描述符#2。有关更多信息,请参阅Bash Hackers Illustrated redirection Tutorial。