Получение вывода предыдущей команды в сценарии оболочки

У меня есть следующий сценарий оболочки:

#!/usr/bin/env sh
./node_modules/.bin/nightwatch --env chrome --tag=enabled
exit 0

Команда nightwatch всегда возвращает exit code 1, независимо от того, будут ли тесты ночного дозора неудачными или пройденными. Итак, я хочу проверить, содержит ли консольный вывод этой команды определенную строку (возможно, failed), которую нужно обработать, и вернуть правильный код выхода с помощью сценария оболочки.

Единственное требование, которое у меня есть, это чтобы вывод команды nightwatch был виден на консоли, потому что он понадобится нам по причинам отладки.

Я хочу сделать что-то вроде этого (псевдокод):

#!/usr/bin/env sh
./node_modules/.bin/nightwatch --env chrome --tag=enabled
if lastOutput.contains("failed"); then
  exit 1
else
  exit 0
fi

person Martin    schedule 27.03.2018    source источник
comment
Используйте $?. Это вернет код выхода последней команды.   -  person Joao Vitorino    schedule 27.03.2018
comment
Вы можете использовать подстановку команд. lastOutput=$(./node_modules/.bin/nightwatch --env chrome --tag=enabled) затем проверьте lastOutput как [[ $lastOutput = *failed* ]] && exit 1 || exit 0   -  person anubhava    schedule 27.03.2018
comment
Но nightwatch всегда возвращает код выхода 1, независимо от того, провалятся тесты nightwatch или нет. Итак, я должен проанализировать вывод ночного дозора, чтобы решить, какой код выхода я должен вернуть.   -  person Martin    schedule 27.03.2018
comment
@Martin Я бы потратил некоторое время на выяснение, почему он всегда выходит из 1; это не нормально (или не должно быть).   -  person chepner    schedule 27.03.2018
comment
вот так. я знаю, что это nghtwatch или ошибка селена. Но сначала я должен найти обходной путь для меня. Я также создал проблему с ошибкой для команды ночного дозора.   -  person Martin    schedule 27.03.2018
comment
Вы можете сделать это с помощью stackoverflow.com/questions/16931244/ плюс stackoverflow.com/questions/12451278 /   -  person that other guy    schedule 28.03.2018


Ответы (2)


Поскольку вы запускаете это в оболочке POSIX bourne sh, вы можете сравнить вывод команды с оператором [ или конструкцией case

case "$(./node_modules/.bin/nightwatch --env chrome --tag=enabled)" in
  *failed*)  exit 1;;
   *) exit 0 ;;
esac

или используйте код возврата grep и попросите его молчать с установленным флагом -q

if ./node_modules/.bin/nightwatch --env chrome --tag=enabled | grep -q failed; then
    exit 1 
else
    exit 0
fi
person Inian    schedule 27.03.2018
comment
Я бы предпочел if ./node<etc> | grep -q 'failed'; then exit 1; else exit 0; fi вместо использования $? - на меньшем заявлении и не нужно заботиться о $?. Я бы опубликовал ответ, но он действительно практически такой же, как ваш, поэтому просто комментирую здесь. - person Benjamin W.; 27.03.2018
comment
@Inian: Поскольку OP говорит консольный вывод, а не стандартный вывод, мы должны позаботиться о случае, когда сообщение об ошибке failed печатается в стандартная ошибка (нередкий сценарий), поэтому вы должны добавить 2>&1 к своему решению. - person user1934428; 28.03.2018

Множество более эффективных способов сделать это, но в соответствии с вашим псевдокодом:

#!/usr/bin/env sh
lastOutput=$(./node_modules/.bin/nightwatch --env chrome --tag=enabled)
if [[ $lastOutput = *"failed"* ]]; then
  exit 1
else
  exit 0
fi
person beau    schedule 27.03.2018
comment
Ваше условие всегда будет истинным; вам нужны пробелы вокруг =. - person Benjamin W.; 27.03.2018