Shell 从以前的函数中获取返回代码

Shell 从以前的函数中获取返回代码,shell,unix,Shell,Unix,我正在尝试在Unix上编写一个提醒脚本,一旦某些相当耗时的任务完成,它将向我发送一封电子邮件。我希望它也能向我发送任务的返回代码,但我很难在脚本中完成这一任务 现在,脚本如下所示: AUTOMATIC_SUBJECT="$? was returned by $(history -1| cut -c 6- | head -1)" if [[ $# = 0 ]]; then SUBJECT=$AUTOMATIC_SUBJECT BODY="" elif [[ $# = 1 ]]; th

我正在尝试在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_rementer.sh”(我将进行剪切或其他操作,最终删除“;send_reinder.sh”,但现在这并不重要)

但是如果我跑

cat 123;send_reminder.sh "cat 123 returned $?" "body"
我把“猫123返回2”作为主题。注意“$?”在脚本中的位置,在执行history命令之前我需要它,否则它将返回该错误代码


所以问题是,为什么我的脚本没有返回正确的错误代码?我感觉它与将其分配给自动主题变量有关,但我不确定如何绕过它。

要获得正确的
$?
值,请尝试:

cat 123; source send_reminder.sh
或者,等效地,但键入较少:

cat 123; . send_reminder.sh. 
源代码脚本意味着它在当前shell中执行。这有一个轻微的副作用,即shell变量(如自动主题、主题和主体)将保留在当前环境中


或者,您需要在命令行上传入
$?

实际上,当您使用rum cat 123时;send_rementer.sh这意味着您最近运行的命令是send_rementer.sh so$?如果此脚本在行尾运行为正,则将返回0。因此,在这种情况下,$subject很可能为空。我不确定我是否理解,怎么可能$?提供我当前运行的脚本的返回代码?要正确获取
$?
值,请尝试:
cat 123;source send_remention.sh
或,键入更少的内容,
cat 123。发送提醒。sh
。(这有一个轻微的副作用,即shell变量AUTOMATIC_SUBJECT、SUBJECT和BODY将保留在当前环境中。)或者,您需要在命令行上传入
$?
。很抱歉,我解释错了。这很有效!通过在脚本开头设置TEMP_BODY=$BODY,然后在脚本末尾设置BODY=$TEMP_BODY,可以轻松避免这种副作用。现在,如果同时运行其他命令,我可能会遇到获取正确历史变量的问题,但这是一个单独的问题。想把你的评论变成答案吗,约翰?我保证接受/赞成它