Скрытие ошибки сегментации при одновременном информировании следующих команд об этом инциденте - PullRequest
1 голос
/ 28 октября 2019

Этот вопрос задал вопрос о том, как скрыть ошибку сегментации в скрипте bash, и @yellowantphil предоставил решение: направить вывод куда угодно

Теперь я просматриваю множество переданных репозиториев. от моих учеников. Мне нужно проверить, могут ли исходные коды в каждом репозитории быть скомпилированы, и если да, может ли исполняемый файл работать должным образом.

И я заметил, что некоторые из их исполняемых файлов завершаются с ошибкой с выходным «ошибка сегментации»,Поскольку я хочу скрыть большинство деталей в своем сценарии, я предпочитаю не показывать ничего из этого раздражающего вывода (и, таким образом, я нашел вопрос, упомянутый выше). Тем не менее, я все еще должен знать, что происходит (чтобы пропустить цикл). Что мне теперь делать?

Минимальное воспроизведение этой проблемы:

  1. Создайте любой исполняемый файл, вызывающий «ошибку сегментации»
  2. Поместите его в скрипт Bash:
#!/bin/bash

./segfaultgen >/dev/null 2>&1 | :

echo $?

С этим | : (упомянутым в ответе @ yellowantphil) в следующем предложении показан вывод 0, который не говорит правду. Однако сообщения об ошибках появляются, если | : закомментирован. Я также пытался добавить || echo 1 до | :. Это не работает так же: (

1 Ответ

2 голосов
/ 28 октября 2019

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

(В общем, это хороший вариант. Я включаю его по умолчанию во всех моих сценариях.)

#!/bin/bash

set -o pipefail

./segfaultgen &>/dev/null | :
echo $?

Также, поскольку вы используете bash, &>/dev/null короче.

...