我正在尝试在Unix上编写一个提醒脚本,一旦完成某些相当耗时的任务,它将向我发送一封电子邮件。我希望它也向我发送任务的返回代码,但我很难在脚本中完成这项工作
现在脚本看起来像这样:
AUTOMATIC_SUBJECT="$? was returned by $(history -1| cut -c 6- | head -1)"
if [[ $# = 0 ]]; then
SUBJECT=$AUTOMATIC_SUBJECT
BODY=""
elif [[ $# = 1 ]]; then
SUBJECT=$AUTOMATIC_SUBJECT
BODY=$1
elif [[ $# = 2 ]]; then
SUBJECT=$1
BODY=$2
fi
echo "$BODY" | mailx -s "$SUBJECT" email@address.com
如果我运行以下命令:
cat 123;send_reminder.sh
如果123是当前目录中不存在的文件,我得到主题为“0由cat 123返回; send_reminder.sh”(我会做一个剪切或最终摆脱'; send_reinder.sh',但现在这并不重要。)
但是,如果我跑
cat 123;send_reminder.sh "cat 123 returned $?" "body"
我得到“猫123返回2”作为主题。请注意“$?”的位置,在我执行history命令之前需要它的脚本中,否则它将返回该错误代码。
所以问题是,为什么我的脚本没有返回正确的错误代码?我觉得它与将自己分配给automatic_subject变量有关,但我不知道如何绕过它。
答案 0 :(得分:1)
要使$?
值正确,请尝试:
cat 123; source send_reminder.sh
或等效,但键入较少:
cat 123; . send_reminder.sh.
获取脚本意味着它在当前shell中执行。这具有温和的副作用,即shell变量(例如AUTOMATIC_SUBJECT,SUBJECT和BODY)将保留在当前环境中。
或者,您需要在命令行中传递$?
。