как насчет $() в PS1, например:
export PS1='\w $(if test "\j" -ne "0"; then echo -e "\033[32m\j "; fi )\[\033[01;35m\]\$\[\033[00m\] '
Так, использование strace
на замененном процессе показало, что tail
и head
получали SIGHUP от ядра до того, как успевали написать. Простой обходной путь - добавить nohup
в подстановку:
rm -f log; exec ./script.sh >(nohup tail >log)
Кажется, я понимаю, почему это не работает с exec. IIUC, >(tail >log) создает дочерний процесс текущего процесса bash
. Однако при использовании exec он становится дочерним процессом script.sh
. Когда script.sh завершается, ядро посылает SIGHUP
всем дочерним процессам.
Все еще не уверен, почему это раньше работало, возможно, в новых версиях ядра оно быстрее/агрессивнее отправляет свои SIGHUP.