Bash Process Substitution в строке exec, некоторые команды перестали работать

как насчет $() в PS1, например:

export PS1='\w $(if test "\j" -ne "0"; then echo -e "\033[32m\j "; fi )\[\033[01;35m\]\$\[\033[00m\] '
1
15.10.2016, 00:22
1 ответ

Так, использование 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.

0
28.01.2020, 01:10

Теги

Похожие вопросы