Depende do shell. Alguns fazem otimização de chamada de cauda, outros não. Você pode testar isso facilmente executando SHELL -c 'ps $$'
. Se ps
se ver, o shell executou o último comando no mesmo processo. Se ps
vir o shell, o shell executará o último comando em um subprocesso, como ocorre com os comandos que não são o último.
$ for s in dash bash mksh ksh zsh; do echo -n "$s "; $s -c 'ps -o comm= $$'; done
dash dash
bash ps
mksh mksh
ksh ps
zsh ps
Então bash, ksh e zsh do tail chamam otimização, dash e mksh não.
Otimização de chamada de cauda só pode ser feita para o último comando em um script. Por exemplo, se houver uma armadilha ativa, ela não será uma chamada final, já que o shell precisa ficar para trás caso a armadilha seja acionada.
Você pode forçar uma chamada final colocando exec
na frente do comando. O exec
builtin executa o comando especificado no mesmo processo. Comandos adicionais no script não serão executados desde que o shell tenha desaparecido.
A recursão não é idiomática em scripts de shell. Seria mais idiomático usar um loop:
#!/bin/sh
while true; do
mysql -h "localhost" -u "root" "-p********" "database" < "update.sql"
sleep 5
done
ou, se você quiser que o script seja encerrado se o comando sleep
for eliminado por um sinal:
#!/bin/sh
while
mysql -h "localhost" -u "root" "-p********" "database" < "update.sql"
sleep 5
do
:
done
ou, se você quiser que o script seja encerrado se mysql
falhar:
#!/bin/sh
while
mysql -h "localhost" -u "root" "-p********" "database" < "update.sql"
do
sleep 5
done