Например, когда ВНЕЗАПНО выясняется, что из-за медленного интернета процесс установки нового пакета (и пятнадцати библиотек, от которых он зависит :) затянется на четверть часа, глупо сидеть и пялиться в экран на ползунок apt-get. Лучше переключиться на другую деятельность, а к новому пакету вернуться только тогда, когда он будет готов. Конечно, можно прервать процесс и запустить заново с добавлением & notify-send "Job done, my Master!" после команды, но это же не Ъ-way!
Мне казалось, что в богатейшем списке утилит командной строки обязательно есть какая-нибудь штукенция, которая позволит решить эту проблему с помощью одной-единственной команды, но гуглёж показал, что магического слова всё же нет, и все используют связку while & wait. Но лень - страшная вещь, и писать каждый раз (даже примитивный) цикл дико ломает.
Поэтому на основе пары источников был создан следующий опус:
% cat doafter #!/bin/sh delay=2 pid=$1 shift cmd=$@ usage=0 if [ "$pid" == "" ] then usage=1 echo "PID is required" fi if [ "$cmd" == "" ] then usage=1 echo "COMMAND is required" fi if [ "$usage" == "1" ] then echo "Usage: doafter PID COMMAND" echo "where" echo " PID = Process id to wait for" echo " COMMAND = Command to be executed after it completes" exit fi while ps -p $pid >/dev/null; do sleep $delay; done $cmd
Отныне, закинув этот скрипт в /usr/local/bin, я могу уведомлять сам себя о завершении длинного процесса хоть через notify-send, хоть через mpc play, хоть через что-угодно-ещё. Хотя, конечно, если бы существовала "магическая команда" для тех же целей, не пришлось бы и скриптованием заниматься.
В качестве дополнительного упражнения надо будет разобраться, как сделать так, чтобы можно было использовать автодополнение bash/zsh для завершения выполняемой команды. А то ввожу номер процесса, набиваю начало команды, жму таб - а шелл ничего не добавляет! Непорядок :(