LinuxForum.Fans
Тема

Запрет вывода в консоль для приложения

Автор: SamuelLinux 11 сообщений 5970 просмотров
#52820

Здравствуйте.

Как запретить приложению, запущенному из консоли, выводить в неё отладочную информацию? Существует ли какая-либо утилита для этой цели?

В настоящий момент я использую утилиту nohup. Она действительно позволяет освободить консоль от ненужного вывода. Однако, взамен этого nohup помещает отладочные данные в файл ~/nohup.out. Мне же нужна возможность самому решать будут ли выводиться информационные сообщения и если да, то куда они будут помещаться. По поводу nohup ещё хочу заметить, что всё-таки первичная задача этой утилиты — заставить приложение игнорировать сигнал потери связи (SIGHUP), и использовать её в качестве блокиратора вывода, на мой взгляд, не совсем корректно.

Спасибо.

Debian GNU/Linux 5.0.4.

#52821

exec-app >/dev/null 2>&1

#52823
mydoom написал:
exec-app >/dev/null 2>&1

А поподробнее? Для меня это простой набор "слов". Я не прошу объяснить, я прошу указать направление :D.

#52844

[off]
В поисках "направления" зашел на википедию, статью про bash и заметил, что скрин типичной сессии в bash сделан в Gentoo. :D
[/off]

#52851

В 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

#52855

mydoom, спасибо, это именно то, что было нужно.

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, то всё, что будет передано нашим приложением просто исчезнет.

Остается только добавить, что для освобождения консоли для ввода можно к указанной выше команде добавить символ &:

text

application > /dev/null 2>&1 &

Прошу меня поправить, если я где-то был неточен.

________
Источники:

Стандартные потоки

/dev/null

2>&1

#52874

Всё верно.

#52927

О! Спасибо. Про то, что ">" и ">>" - это перенаправление вывода я знал, а вот в такой комбинации не встречал.

P.S. Ссылки - это очень хорошо wink .

Можно было написать так.

text

exec-app &>/dev/null 
#52934

Добавлю ещё, что с помощью следующих команд задачу можно решать элегантнее:

text

application &> /dev/null   # с блокировкой ввода
appliсation &> /dev/null & # с освобождением консоли для ввода

Оператор &> позволяет переправить и stdout, и stderr в указанный файл.

________
Update:

mycetophylax, опередили вы меня.

#52936
SamuelLinux написал:
Добавлю ещё, что с помощью следующих команд задачу можно решать элегантнее:
text

application &> /dev/null   # с блокировкой ввода
appliсation &> /dev/null & # с освобождением консоли для ввода

Оператор &> позволяет переправить и stdout, и stderr в указанный файл.

________
Update:

mycetophylax, опередили вы меня.

Вы же научили :D

#52947

Ну и напоследок ещё один вариант, который позволяет отказаться от использования файла /dev/null.

text

application >&-

appliсation 2>&-

application >&- 2>&-

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

Войдите или зарегистрируйтесь, чтобы ответить.