Для начала оговорюсь, что "отключать" вывод программы может быть вредно. Так например, если программа внезапно завершилась, её "предсмертные" слова могут помочь нам понять причину завершения.
Но хотим – значит делаем! Для начала разберёмся, как же программа выводит текст в консоль.
Файловые дескрипторы процессов в Unix-подобных системах
Каждая программа, которая запускается на Unix-подобной операционной системе имеет набор файловых дескрипторов (описателей). Дескрипторы используются для взаимодействия с потоками ввода / вывода, файлами, сокетами сети. В процессе жизнедеятельности программа может открывать новые дескрипторы и закрывать / освобождать старые.
Обычно при старте операционной системой выделяется 3 дескриптора:
- для стандартного ввода (stdin) – используется для получения информации от пользователя в терминале / программ, и которых пайпом перенаправили вывод;
- для стандартного потока вывода (stdout) – печать на терминал,
- для потока вывода ошибок (stderr) – печать ошибок и предупреждений (также по умолчанию на терминал)
– имеющие номера 0, 1 и 2 – соответственно.
Перенаправление потоков ввода / вывода
Стандартный поток вывода отнюдь не обязан выводить результат в терминал. К примеру, мы можем его перенаправить в файл, например:
some_program > ./file.txt
Однако, под каждую программу создавать файл, который к тому же будет
занимать какое ни какое дисковое пространство – расточительно. Для
этой задачи вполне сойдёт стандартный для Unix-like систем псевдо-файл
/dev/null
. В него можно записать всё что угодно, но нельзя ничего прочитать –
этакая персональная чёрная дыра.
some_program 1> /dev/null
Можно увидеть, что появилась "1" перед символом перенаправления. Таким образом можно указать, какой по номеру поток мы перенаправляем. По умолчанию используется 1-ый – стандартный поток вывода.
Теперь нам нужно перенаправить стандартный поток ошибок. Сделаем мы это
через перенаправление его в 1-ый (stdout), который уже перенаправлен в
/dev/null
:
some_program 2>&1 1> /dev/null
Если мы хотим перенаправить вывод из одного дескриптора в другой –
перед номером принимающего дескриптора необходимо поставить &
. Иначе –
запишем в файл "1".
Запуск программы в терминале в фоне
Также символ &
нам понадобится для запуска программы в фоне. Например,
давайте запустим простую, но долгую программу в фоне, выполним другую программу,
а потом вернём из фона первую программу.
$ sleep 100 & [1] 4925 $ echo "Hello" Hello $ jobs [1]+ Running sleep 100 & $ fg 1 sleep 100 ^C
С помощью команды jobs
можно получить
список запущенных в сессии терминала задач. Задачи пронумерованы – по
этим номерам можно поднимать задачи из фонового режима командой
fg
.
Таким образом, нашу программу мы можем "запустить в терминале в фоне, без вывода какого либо текста" следующим способом:
some_program 2>&1 > /dev/null &