Перенаправить стандартный вывод в файл и стандартный вывод в файл и на экран

Я использую valgrind, чтобы избавиться от ошибок в моей программе. Memcheck Вальгринда печатает в stderr. Я хочу изменить это:

valgrind --tool=memcheck ./a.out >output 2>grindout

Но я также хочу, чтобы вывод valgrind отображался на экране. Таким образом, вывод программы все идет в файл. Выход Valgrind помещается в grindout и отображается на экране. Как мне это сделать?

спасибо.

4
задан 11 September 2017 в 20:46

3 ответа

Используйте для этого тройник, но вам нужно сыграть несколько хитростей с stdout / stderr.

valgrind --tool=memcheck ./a.out 2>&1 > output | tee grindout

Объяснение: 2>&1 отправляет stderr на стандартный вывод, а обычный стандартный вывод отправляется в файл output. Программа tee передает стандартный ввод, но также сохраняет его в файл grindout.

0
ответ дан 11 September 2017 в 20:46

Вы ищете команду tee. К сожалению, есть некоторые хитрости относительно перенаправления stderr и stdout. Должно работать следующее:

valgrind --tool=memcheck ./a.out 3>&1 2>&3 >output | tee grindout

Это перенаправляет стандартный вывод в output, перемещает стандартную ошибку в новый файловый дескриптор 3, который указывает на стандартный вывод. tee берет этот stdout-ified stderr и печатает его как на экран, так и на gridnout.

0
ответ дан 11 September 2017 в 20:46

У меня была эта та же проблема. Проблема была вызвана путем буферизации. Можно читать больше о там здесь: http://mywiki.wooledge.org/BashFAQ/009

Это - решение, которое работало на меня:

stdbuf -o0 valgrind -v --tool=memcheck stdbuf -o0 ./a.out  2>&1 | stdbuf -o0 tee grindout

'stdbuf -o0' помещенный перед каждой из трех программ, которые выполнены, заставляет их выключать буферизацию.

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

-1
ответ дан 11 September 2017 в 20:46

Другие вопросы по тегам:

Похожие вопросы: