Получение статуса команды против возвращаемого значения команды - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть t csh код ниже.

Все, что я хочу сделать, - это присвоить SUCCESS или FAIL команды «mail» переменной «mail_status» и использовать «mail_status» 'значение для печати сообщения STDOUT.

Ожидается, что почтовая команда вернет 1, если какой-либо из получателей в списке "to" является недействительным. Если все получатели действительны, тогда возвращается статус 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 Ответ

1 голос
/ 11 апреля 2020

Чтобы получить код выхода из последней программы, используйте $status или $?:

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

$? аналогично $status и более привычно для пользователей оболочки Bourne, поэтому возможно, это немного лучше.

С set mail_status = `mail ..` вы получаете вывод команды, а не состояние выхода.

Я считаю, что обычно лучше явно захватить $status как можно скорее, чтобы предотвратить случайное изменение другими командами при будущих изменениях в сценарии.

...