获取命令的状态与命令的 return 值

Getting the status of a command vs return value of the command

下面有tcsh代码。

我想做的就是将 "mail" 命令的 SUCCESS 或 FAIL 分配给一个名为 'mail_status' 的变量,并使用 'mail_status' 值打印 STDOUT 消息。

期望是邮件命令returns 1,如果"to"列表中的任何收件人无效。如果所有收件人都有效,则状态 return 为 0。

  1. 我通过取消注释所有“_TRY_1”来尝试代码。它没有按照我想要的方式工作,'mail_status' 是空白的,因此执行了其他条件。
  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

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

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

$?$status相同,对于Bourne shell用户来说更熟悉,所以可以说更好一些。

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

我发现通常最好尽快显式捕获 $status,以防止将来对脚本的更改意外被其他命令覆盖。