Я делаю тестовый скрипт для компиляции (через make) и запускаю кучу тестов. У меня есть серия команд cat , grep и sed которые хорошо организовывают результаты всех тестов, однако дампы ядра являются исключением. Допустим, у меня есть программа под названием test . Если дамп ядра ./test , следующие строки не поймают его (так как он не будет передан в файл):

./test 2>&1 > >(tee log)
./test > log 2>&1

Это, вероятно, из-за этого сообщения об ошибке из скрипта:

./script.sh: строка 53: 4783 Прервано (ядро выгружено) ./test 2> & 1>> (журнал событий)

У меня есть хакерский обходной путь, который заставляет make запускать программу с пользовательским правилом:

сделать run-test 2> & 1 | чайник

В настоящее время это работает, но немного глупо использовать make-файл для этого. Есть ли другой способ захватить дамп ядра без прерывания строки сценария оболочки?

2 ответа2

2

Это оболочка, которая печатает это сообщение, а не сбой программы. Чтобы получить выходные данные оболочки, вы также хотите:

{
./test
} > log 2 >&1

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

В качестве альтернативы, если вы хотите, чтобы весь вывод перенаправлялся на оставшуюся часть сценария, вы можете использовать:

exec > log 2>&1
1

Если вы хотите запустить свою test программу из другого скрипта, она должна быть достаточно хороша, чтобы получить выходные данные этого скрипта.  То есть, поместите « ./test » в testscript.sh , а затем скажите

./testscript.sh > log 2>&1

Более компактное, но менее интуитивное решение

sh -c "./test" > log 2>&1

Оба решения основаны на том факте, что оболочка, которая запускает программу, - это парень, который замечает, когда программа выгружает ядро, и выдает соответствующее сообщение об ошибке.  Поэтому, чтобы захватить это сообщение, вы должны захватить вывод из оболочки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .