Как запретить приложению, запущенному из консоли, выводить в неё отладочную информацию? Существует ли какая-либо утилита для этой цели?
В настоящий момент я использую утилиту nohup. Она действительно позволяет освободить консоль от ненужного вывода. Однако, взамен этого nohup помещает отладочные данные в файл ~/nohup.out. Мне же нужна возможность самому решать будут ли выводиться информационные сообщения и если да, то куда они будут помещаться. По поводу nohup ещё хочу заметить, что всё-таки первичная задача этой утилиты — заставить приложение игнорировать сигнал потери связи (SIGHUP), и использовать её в качестве блокиратора вывода, на мой взгляд, не совсем корректно.
В bash, как по-моему, даже в самом допотопном command.com есть операторы перенаправления вывода и конвейризации. То что написал mydoom означает запустить программу exec-app (exec-app >/dev/null 2>&1), перенаправить стандартный вывод программы STDOUT в /dev/null (exec-app >/dev/null 2>&1) и поток ошибок STDERR отправить туда же (exec-app > /dev/null 2>&1).
А если, допустим, запустить программу app1 и направить ее вывод во ввод программы app2, то это так:
app1|app2
mycetophylax, насколько я понял, данная команда работает следующим образом:
После запуска приложение может выводить некоторую информацию на экран консоли, используя два потока: stdout и stderr. Эти потоки имеют номера 1 и 2 соответственно. При выводе информационных сообщений приложение использует поток 1, а при выводе отладочных сообщений и сообщений о различных ошибках — поток 2. Мы можем перенаправить вывод в файл как из одного потока, так и из другого. Для этого мы используем символы > и 2>. Например:
text
# выводить информационные сообщения в файл
application > ~/info.txt
# выводить отладочные сообщения в файл
application 2> ~/error.txt
В ОС Linux есть специальный файл /dev/null. Любые данные, записанные в этот файл просто исчезают. В связи с этим в мире Unix распространена следующая идиома:
text
application > /dev/null
Т. о. любые информационные сообщения, переданные приложением application уйдут в никуда. Разумеется, таким же способом можно удалять и отладочные сообщения:
text
application 2> /dev/null
Скомбинировать эти две команды поможет специальная переменная &1. Она содержит стандартный вывод. Мы сначала переправляем стандартный вывод (stdout) в файл:
text
application > /dev/null...
а затем, переправляем вывод отладочных сообщений (stderr) в стандартный вывод:
text
...2>&1
Поскольку стандартный вывод уже перенаправлен в файл, то и вывод отладочных сообщений будет направлен туда же:
text
application > /dev/null 2>&1
Т. к. целевым файлом для обоих типов сообщений будет /dev/null, то всё, что будет передано нашим приложением просто исчезнет.
Остается только добавить, что для освобождения консоли для ввода можно к указанной выше команде добавить символ &:
Ну и напоследок ещё один вариант, который позволяет отказаться от использования файла /dev/null.
text
application >&-
appliсation 2>&-
application >&- 2>&-
Здесь в первом случае блокируется вывод в stdout, во втором — в stderr, а третий пример является комбинацией первого и второго, блокируя таким образом и стандартный, и отладочный выводы.