Как запустить оболочку script в фоновом режиме и не получить вывод

Я написал два сценария оболочки a.sh и b.sh. В a.sh и b.sh у меня есть бесконечный цикл for, и они печатают некоторый вывод на терминал. Я хочу написать еще один script, который вызывает как a.sh, так и b.sh, но я хочу, чтобы пользователь немедленно восстановил контроль над терминалом, вместо того, чтобы script работал бесконечно, и я хочу скрыть вывод в терминале.

Ответ 1

Используйте nohup, если ваше фоновое задание занимает много времени, или вы просто используете SecureCRT или что-то вроде входа в систему на сервере.

Перенесите stdout и stderr на /dev/null, чтобы игнорировать вывод.

nohup /path/to/your/script.sh > /dev/null 2>&1 &

Ответ 2

Перенаправить вывод в файл следующим образом:

./a.sh > somefile 2>&1 &

Это перенаправит как stdout, так и stderr в один и тот же файл. Если вы хотите перенаправить stdout и stderr в два разных файла, используйте это:

./a.sh > stdoutfile 2> stderrfile &

Вы можете использовать /dev/null как один или оба файла, если вам не нравятся stdout и/или stderr.

Подробнее о перенаправлениях см. bash manpage.

Ответ 3

Простите, что это немного поздно, но найдено идеальное решение для сложных команд, где вы не хотите, чтобы какой-либо стандарт или ошибка выводились (кредит, при котором он должен: http://felixmilea.com/2014/12/running-bash-commands-background-properly/)

Это перенаправляет вывод на нуль и сохраняет разрешение экрана:

command &>/dev/null &

Ответ 4

Если они находятся в том же каталоге, что и ваш script, который содержит:

./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &

& в конце - это то, что заставляет ваш script работать в фоновом режиме.

Часть > /dev/null 2>&1 не нужна - она ​​перенаправляет потоки stdout и stderr, поэтому вам не нужно видеть их на терминале, что вы можете захотеть сделать для шумных скриптов с большим количеством выходных данных.