Как подавить вывод и проверить, успешна ли команда? - PullRequest
2 голосов
/ 11 апреля 2019

Я пытаюсь написать сценарий powershell, который проверяет успешность входа в MySQL, используя $? для проверки возникновения ошибки.

Я также хочу подавить все выходные данные - успешные или неуспешные - из команды.

Вот что я пробовал:

mysql -u root --password=mypass -e "show databases"
If ( $? ) {
  echo "Hooray!"
} Else {
  echo "Boo!"
}

Это работает правильно, но не подавляет вывод.

mysql -u root --password=mypass -e "show databases" > $null

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

mysql -u root --password=mypass -e "show databases" 2> $null

Это не работает правильно. В этом примере всегда выводится «Boo!»

mysql -u root --password=mypass -e "show databases" > $null 2>&1

Это правильно подавляет все выходные данные, но выводит только "Boo!" как раньше.

1 Ответ

2 голосов
/ 11 апреля 2019

Используйте $LASTEXITCODE -eq 0 вместо $? для надежного обнаружения ненулевого кода выхода (как правило, сбой сигнализации), сообщаемого внешней программой.

Затем вы можете использовать *> $null, чтобы категорически подавить весь вывод , не беспокоясь о влиянии этого перенаправления на $?:

mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
  "Hooray!"
} else {
  "Boo!"
}

Использование перенаправления, которое включает поток ошибок PowerShell - либо явно через 2>, либо неявно через *> - означает, что если какие-либо данные получены через этот поток - что в случае вызова внешней программы означает вывод из stderr - PowerShell устанавливает $? в $false.

Однако в области внешних консольных / терминальных программ stderr используется не только для вывода информации error , но и любой информации, которая не является data , такой как status Информация. Следовательно, вы не можете вывести ошибку из-за наличия вывода stderr.

Внешние консольные / терминальные программы сообщают о своем статусе успеха исключительно через код выхода , который PowerShell отображает в автоматической переменной $LASTEXITCODE.

Из вышесказанного следует, что $? может быть $false, даже если код выхода 0, поэтому он не является надежным индикатором успеха - в отличие от $LASTEXTICODE.

...