A relação pai-filho é arruinada por todos os '&' envolvido.
A chamada do sistema wait(2) , na qual o wait incorporado é aparentemente baseado, só funcionará para um PID filho direto do processo que chama wait(2) .
Quando você invoca sh myprogram & , você executa sh como filho do shell interativo.
Quando você invoca sh notify & , esse sh é filho do shell interativo.
Portanto, o segundo sh não tem nenhum relacionamento pai direto com o primeiro sh e wait não funcionará.
Isso nem funcionará se você invocar sh myprogram &; sh notify; , porque o comando wait é invocado por um filho do shell interativo.
O que funciona para mim é: sh myprogram &; wait O comando wait faz com que o shell interativo (pai do sh chamado explicitamente) permaneça até que sh seja encerrado.