Когда я запускаю произвольную команду в терминале в Linux, есть ли способ подавить вывод сообщений, содержащих определенное предложение?
Я пытался
./mycommand | grep -v "I dont want to see this"
но сообщения все еще были там.
решение1
Возможно, нежелательная часть является частью вывода не на stderr, а на stdout.
Пытаться:
./mycommand 2>&1 | grep -v "I dont want to see this"
Вы можете перенаправить stderr и stdout на разные цели. Так вы сможете увидеть, откуда приходит вывод:
./mycommand > >(grep -v "Я не хочу это видеть" > stdout.log) 2> >(grep -v "Я не хочу это видеть" > stderr.log)
решение2
Чтобы добавить к ответу cmks, если вы также хотите, чтобы код возврата был from mycommand
, а не from grep
, вы можете использовать pipefail
и игнорировать статус возврата from grep
(когда подавляемая строка не найдена)
(set -o pipefail; (./mycommand 2>&1) | { grep -v "I dont want to see this" || true; })
Примеры:
(set -o pipefail; (echo "REMOVE" && false 2>&1) | { grep -v "REMOVE" || true; })
- stdout: ничего
- возвращаться:
1
(set -o pipefail; (echo "REMOVE" && true 2>&1) | { grep -v "REMOVE" || true; })
- stdout: ничего
- возвращаться:
0
(set -o pipefail; (echo "KEEP" && false 2>&1) | { grep -v "REMOVE" || true; })
- стандартный вывод:
KEEP
- возвращаться:
1
- стандартный вывод:
(set -o pipefail; (echo "KEEP" && true 2>&1) | { grep -v "REMOVE" || true; })
- стандартный вывод:
KEEP
- возвращаться:
0
- стандартный вывод: