是否有一个标准的Bash工具,其行为类似于echo,但输出到stderr而不是stdout?
我知道我可以做echo foo 1>&2,但它有点难看,而且,我怀疑,容易出错(例如,当事情发生变化时,更容易编辑错误)。
是否有一个标准的Bash工具,其行为类似于echo,但输出到stderr而不是stdout?
我知道我可以做echo foo 1>&2,但它有点难看,而且,我怀疑,容易出错(例如,当事情发生变化时,更容易编辑错误)。
当前回答
制作脚本
#!/bin/sh
echo $* 1>&2
那将是你的工具。
或者,如果您不想在单独的文件中有脚本,则生成一个函数。
其他回答
由于1是标准输出,因此不必在输出重定向前显式命名它,如>。相反,您可以简单地键入:
echo This message goes to stderr >&2
由于您似乎担心1>&2对您来说很难可靠地打字,因此删除多余的1可能会对您有一点鼓励!
这是一个简单的STDERR函数,它将管道输入重定向到STDERR。
#!/bin/bash
# *************************************************************
# This function redirect the pipe input to STDERR.
#
# @param stream
# @return string
#
function STDERR () {
cat - 1>&2
}
# remove the directory /bubu
if rm /bubu 2>/dev/null; then
echo "Bubu is gone."
else
echo "Has anyone seen Bubu?" | STDERR
fi
# run the bubu.sh and redirect you output
tux@earth:~$ ./bubu.sh >/tmp/bubu.log 2>/tmp/bubu.err
制作脚本
#!/bin/sh
echo $* 1>&2
那将是你的工具。
或者,如果您不想在单独的文件中有脚本,则生成一个函数。
如果您不介意将消息也记录到syslog,那么not_so_丑陋的方法是:
logger -s $msg
-s选项表示:“将消息输出到标准错误和系统日志。”
这里有一个函数用于检查最后一个命令的退出状态,显示错误并终止脚本。
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