Трубопровідне скидання з сценарію


0

Я роблю тестовий сценарій, щоб зібрати (за допомогою make) і провести купу тестів. У мене є ряд cat, grepі sedкоманди , які організовує результати всіх тестів добре, проте ядро-відвали є винятком. Скажімо, у мене є програма під назвою test. Якщо ./testядро демпфірує, наступні рядки не зафіксують його (оскільки в ньому не буде передано файл):

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

Можливо, це повідомлення про помилку зі сценарію:

./script.sh: рядок 53: 4783 Скасований (ядро скинуто) ./test 2> & 1>> (трійник)

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

зробіть пробіг-тест 2> & 1 | трійник - журнал

Наразі це працює, але для цього потрібно скористатися makefile. Чи є інший спосіб захоплення основного дампа, не перериваючи рядок сценарію оболонки?

Відповіді:


1

Якщо ви готові запустити свою testпрограму з іншого сценарію, вона повинна бути достатньо хорошою для отримання результатів із цього сценарію. Тобто, введіть " ./test" testscript.sh, а потім скажіть

./testscript.sh > log 2>&1

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

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

Обидва рішення засновані на тому, що оболонка, яка запускає програму, - це той хлопець, який помічає, коли програма скидає ядро, і видає відповідне повідомлення про помилку. Тому, щоб захопити це повідомлення, ви повинні захопити вихід із оболонки.


2

Це оболонка, яка друкує це повідомлення, а не програма збоїв. Щоб також захопити вихід оболонки, потрібно:

{
./test
} > log 2 >&1

Дужки призводять до запуску підрозділу для виконання команд всередині, а вихід з усієї підкошти переспрямовується замість лише однієї команди.

Якщо ви хочете, щоб весь результат був перенаправлений на решту сценарію, ви можете використовувати:

exec > log 2>&1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.