Определение фонового процесса (я думаю) состоит в том, что у него есть управляющий терминал, но он не является частью группы процессов переднего плана этого терминала.Я не думаю, что какая-либо оболочка, даже zsh, дает вам какой-либо доступ к этой информации через встроенную систему.
В Linux (и, возможно, в других версиях) столбец STAT
в ps
включает +
когда процесс является частью основной группы процессов своего терминала.Таким образом, буквальный ответ на ваш вопрос заключается в том, что вы можете поместить содержимое вашего скрипта в функцию main
и вызвать ее с помощью:
case $(ps -o stat= -p $$) in
*+*) main "$@" &;;
*) main "$@";;
esac
Но вы все равно можете запустить main "$@" &
в любом случае.В Unix форк это дешево.
Однако я настоятельно не советую делать то, что вы предлагаете.Это делает невозможным для кого-то запускать ваш сценарий и делать что-то еще после этого - можно ожидать, что он сможет написать your_script; my_postprocessing
или your_script && my_postprocessing
, но отказ от основной задачи сценария делает это невозможным.Принимая во внимание, что выигрыш иногда сохраняет один символ при вызове скрипта, не стоит делать ваш скрипт заметно менее полезным таким образом.
Если вы действительно хотите, чтобы скрипт работал в фоновом режиме, чтобы пользовательможете закрыть его терминал, вам нужно будет проделать дополнительную работу - вам нужно daemonize сценарий, который включает в себя не только фоновую обработку, но и закрытие всех файловых дескрипторов, у которых открыт терминал, что делает процессведущий сессии и многое другое.Я думаю, что это потребует разделения вашего скрипта на демонизирующий скрипт-обертку и основной скрипт.Но демонизация обычно выполняется для программ, которые никогда не завершаются, если явно не остановлены, что не соответствует описанному вами поведению.