获取命令状态与命令返回值

时间:2020-04-10 01:49:05

标签: tcsh

我下面有tcsh代码。

我要做的就是将“ mail”命令的成功或失败分配给一个名为“ mail_status”的变量,并使用“ mail_status”值来打印STDOUT消息。

期望是邮件命令返回1,如果“收件人”列表中的任何收件人是无效的收件人。如果所有收件人均有效,则状态返回为0。

  1. 我通过取消注释所有“ _TRY_1”来尝试了代码。它没有按我想要的方式工作,'mail_status'为空白,因此执行了else条件。
  2. 我尝试注释掉“ _TRY_1”而取消注释“ _TRY_2_”。它甚至没有执行
  3. 我尝试注释掉“ _TRY_2”而取消注释“ _TRY_3_”。它没用

我的问题: 为什么_TRY_1 _TRY_2_和_TRY_3_不起作用?

#! /tool/pandora/bin/tcsh

set eval_1 = PASSED
set eval_2 = PASSED
set mail_status = 7

if ($eval_1 == "PASSED" && $eval_2 == "PASSED") then
    echo "1"
    # _TRY_1_ set mail_status = `mail -s " PASSED, 1: $eval_1, 2: $eval_2" foo@foo.com < tmp1.log`
    # _TRY_2_ set mail_status = eval "mail -s " PASSED, 1: $eval_1, 2: $eval_2" foo@foo.com < tmp1.log"
    # _TRY_3_ set mail_status = `mail -s " PASSED, 1: $eval_1, 2: $eval_2" foo@foo.com < tmp1.log`
else
    echo "2"
    # _TRY_1_ set mail_status = `mail -s " FAILED, 1: $eval_1, 2: $eval_2" foo@foo.com < tmp2.log`
    # _TRY_2_ set mail_status = eval "mail -s " FAILED, 1: $eval_1, 2: $eval_2" foo@foo.com < tmp2.log"
    # _TRY_3_ `mail -s " FAILED, 1: $eval_1, 2: $eval_2" foo@foo.com < tmp2.log`
endif

# _TRY_3_ set mail_status = $status

echo ""
# _TRY_3_ echo "mail_status = $status"
echo ""

if ($mail_status == 0) then
    echo ""
    echo "EMAIL SENT"
    echo ""
else
    echo ""
    echo "FAILED SENDING EMAIL"
    echo ""
endif

1 个答案:

答案 0 :(得分:1)

要从上一个程序获取退出代码,请使用$status$?

mail -s [..trim..]
set mail_status = $status

$?$status相同,并且对于Bourne shell用户更熟悉,因此可以说它要好一些。

使用set mail_status = `mail ..`捕获命令的输出,而不是退出状态。

我发现通常最好尽快地捕获$status,以防止在以后对脚本进行更改时被其他命令意外覆盖。