Você pode querer
echo first && echo second && echo third & wait
que lhe dá a saída (semelhante a)
[1] 4242
first
second
third
[1]+ Done
O último &
coloca todo o comando anterior em um pipeline / job. Esse trabalho consiste em três comandos encadeados usando a expressão booleana do shell. Se um desses retornos for falso, isso deve terminar a cadeia. Mas todos eles serão executados em segundo plano.
O problema com a execução do primeiro programa em segundo plano, mas o segundo em primeiro plano, é que o segundo comando não sabe se o primeiro foi concluído com êxito. Quando você coloca um programa em segundo plano, seu status será 0 a menos que o programa não possa ser executado para começar. Então, o seguinte realmente não faz sentido:
( start_webservice & ) && curl localhost
Isso também não faz sentido:
start_webservice & test "$?" = 0 && curl localhost
Basta iniciar o serviço em segundo plano e testá-lo incondicionalmente. Mais do que provavelmente, você vai querer esperar um pouco antes de fazer o teste:
start_webservice &
success=0
tries=5
pause=1
while [ $success = 0 -a $tries -gt 0 ]; do
sleep $pause
let tries=tries-1
curl localhost && success=1
done
if [ $success = 0 ]; then
echo "Launch failed"
fi