Не удается перенаправить сообщение об ошибке в моей команде - PullRequest
0 голосов
/ 28 апреля 2018

Я новичок в bash-скриптинге, и вот мой bash-скрипт:

Z=`diff -Z $ref_out $exec_out | grep "[<>]" | wc -l` 2>/dev/null
if [ $Z -gt 0 ]; then
echo "*** testcase: [ stdout - FAILED ]"
else
echo "*** testcase: [ stdout - PASSED ]"
fi

Я бы хотел отключить сообщение об ошибке от diff, например:

diff: No such file or directory

Это может быть результатом отсутствия файла $ ref_out или $ exec_out, хотя я перенаправляю в / dev / null, это сообщение об ошибке все еще отображается. Любая помощь?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Ваше перенаправление не работает, потому что оно применяется к родительской оболочке, а не к подчиненной оболочке, которая выполняет конвейер.

Если вы хотите отправить stderr набора команд в / dev / null, вы можете сделать это следующим образом - я использую $() вместо backticks :

Z=$( { diff -Z $ref_out $exec_out | grep "[<>]" | wc -l; } 2>/dev/null )

Здесь 2>/dev/null применяется ко всем командам внутри { }.


В вашем коде много проблем. Вы могли бы переписать это лучше:

if diff -Z "$ref_out" "$exec_out" 2>/dev/null | grep -q "[<>]"; then
  echo "*** testcase: [ stdout - FAILED ]"
else
  echo "*** testcase: [ stdout - PASSED ]"
fi
  • grep -q - лучший способ сделать эту проверку, и вам не понадобится wc -l, если вы не хотите знать точное количество совпадений
  • вам нужно процитировать ваши переменные
  • if оператор может включать команды; вам не нужно захватывать вывод, чтобы использовать его в операторе if

Вы можете использовать shellcheck , чтобы проверить ваш сценарий оболочки и посмотреть, делаете ли вы обычные ошибки, которые могут нарушить ваш код.

0 голосов
/ 28 апреля 2018

Вам нужен diff s stderr, чтобы перейти к / dev / null, поэтому вместо него должно быть:

Z=`diff -Z $ref_out $exec_out 2> /dev/null | grep "[<>]" | wc -l`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...