是否有一个标准的Bash工具,其行为类似于echo,但输出到stderr而不是stdout?
我知道我可以做echo foo 1>&2,但它有点难看,而且,我怀疑,容易出错(例如,当事情发生变化时,更容易编辑错误)。
是否有一个标准的Bash工具,其行为类似于echo,但输出到stderr而不是stdout?
我知道我可以做echo foo 1>&2,但它有点难看,而且,我怀疑,容易出错(例如,当事情发生变化时,更容易编辑错误)。
当前回答
注意:我回答的是帖子,而不是误导性/模糊的“输出到stderr的回声”问题(OP已经回答了)。
使用函数来显示意图和所需实现的来源。例如。
#!/bin/bash
[ -x error_handling ] && . error_handling
filename="foobar.txt"
config_error $filename "invalid value!"
output_xml_error "No such account"
debug_output "Skipping cache"
log_error "Timeout downloading archive"
notify_admin "Out of disk space!"
fatal "failed to open logger!"
错误处理为:
ADMIN_EMAIL=root@localhost
config_error() { filename="$1"; shift; echo "Config error in $filename: $*" 2>&1; }
output_xml_error() { echo "<error>$*</error>" 2>&1; }
debug_output() { [ "$DEBUG"=="1" ] && echo "DEBUG: $*"; }
log_error() { logger -s "$*"; }
fatal() { which logger >/dev/null && logger -s "FATAL: $*" || echo "FATAL: $*"; exit 100; }
notify_admin() { echo "$*" | mail -s "Error from script" "$ADMIN_EMAIL"; }
OP中处理问题的原因:
最好的语法(有意义的单词而不是难看的符号)更难出错(尤其是如果重用脚本)它不是标准的Bash工具,但它可以是您或您的公司/组织的标准shell库
其他原因:
清晰-向其他维护人员表明意图速度-函数比shell脚本快可重用性-一个函数可以调用另一个函数可配置性-无需编辑原始脚本调试-更容易找到导致错误的行(尤其是当您正在处理大量重定向/过滤输出时)健壮性-如果缺少函数并且无法编辑脚本,则可以使用同名的外部工具(例如,log_error可以别名为logger)切换实现-通过删除库的“x”属性,可以切换到外部工具输出不可知-您不再需要关心它是否到达STDERR或其他地方个性化-您可以使用环境变量配置行为
其他回答
注意:我回答的是帖子,而不是误导性/模糊的“输出到stderr的回声”问题(OP已经回答了)。
使用函数来显示意图和所需实现的来源。例如。
#!/bin/bash
[ -x error_handling ] && . error_handling
filename="foobar.txt"
config_error $filename "invalid value!"
output_xml_error "No such account"
debug_output "Skipping cache"
log_error "Timeout downloading archive"
notify_admin "Out of disk space!"
fatal "failed to open logger!"
错误处理为:
ADMIN_EMAIL=root@localhost
config_error() { filename="$1"; shift; echo "Config error in $filename: $*" 2>&1; }
output_xml_error() { echo "<error>$*</error>" 2>&1; }
debug_output() { [ "$DEBUG"=="1" ] && echo "DEBUG: $*"; }
log_error() { logger -s "$*"; }
fatal() { which logger >/dev/null && logger -s "FATAL: $*" || echo "FATAL: $*"; exit 100; }
notify_admin() { echo "$*" | mail -s "Error from script" "$ADMIN_EMAIL"; }
OP中处理问题的原因:
最好的语法(有意义的单词而不是难看的符号)更难出错(尤其是如果重用脚本)它不是标准的Bash工具,但它可以是您或您的公司/组织的标准shell库
其他原因:
清晰-向其他维护人员表明意图速度-函数比shell脚本快可重用性-一个函数可以调用另一个函数可配置性-无需编辑原始脚本调试-更容易找到导致错误的行(尤其是当您正在处理大量重定向/过滤输出时)健壮性-如果缺少函数并且无法编辑脚本,则可以使用同名的外部工具(例如,log_error可以别名为logger)切换实现-通过删除库的“x”属性,可以切换到外部工具输出不可知-您不再需要关心它是否到达STDERR或其他地方个性化-您可以使用环境变量配置行为
制作脚本
#!/bin/sh
echo $* 1>&2
那将是你的工具。
或者,如果您不想在单独的文件中有脚本,则生成一个函数。
这里有一个函数用于检查最后一个命令的退出状态,显示错误并终止脚本。
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
read是一个shell内置命令,可打印到stderr,可以像echo一样使用,而无需执行重定向技巧:
read -t 0.1 -p "This will be sent to stderr"
-t 0.1是一个超时,它禁用读取的主要功能,将一行stdin存储到变量中。
这是一个简单的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