获取命令的状态与命令的 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。
- 我通过取消注释所有“_TRY_1”来尝试代码。它没有按照我想要的方式工作,'mail_status' 是空白的,因此执行了其他条件。
- 我尝试注释掉“_TRY_1”并取消注释“_TRY_2_”。它甚至没有执行
- 我尝试注释掉“_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
,以防止将来对脚本的更改意外被其他命令覆盖。
下面有tcsh代码。
我想做的就是将 "mail" 命令的 SUCCESS 或 FAIL 分配给一个名为 'mail_status' 的变量,并使用 'mail_status' 值打印 STDOUT 消息。
期望是邮件命令returns 1,如果"to"列表中的任何收件人无效。如果所有收件人都有效,则状态 return 为 0。
- 我通过取消注释所有“_TRY_1”来尝试代码。它没有按照我想要的方式工作,'mail_status' 是空白的,因此执行了其他条件。
- 我尝试注释掉“_TRY_1”并取消注释“_TRY_2_”。它甚至没有执行
- 我尝试注释掉“_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
,以防止将来对脚本的更改意外被其他命令覆盖。