A construção padrão para definir uma função é
run_backup () { … }
Em ksh, bash e zsh, mas não em outros shells, como dash, você pode definir uma função com
function run_backup { … }
O que aconteceu quando você executou o script com traço foi:
- O shell executou a linha
$(run_backup)
, resultando naturalmente na primeira mensagem de erro, pois não havia nenhum comando chamadorun_backup
. - O shell executou posteriormente o
function run_backup
, resultando naturalmente na segunda mensagem de erro, pois não havia nenhum comando chamadofunction
. - Em seguida, o shell executou o bloco de contraventamento, que por si só é uma sintaxe de shell válida.
Note que, como o comentário do xenoterracide indica, desde que você tenha #!/bin/bash
, o script teria sido executado por bash
se você não tivesse feito algo errado.
Mesmo se você executar o script com o shell correto ou (minha recomendação) alterar function
para a sintaxe padrão (não vejo nenhuma outra construção não padrão), ainda será necessário mover a definição da função para antes de ser usado.
Mais uma dica útil: quando estiver depurando um script de shell, execute bash -x /path/to/script
(ou sh -x /path/to/script
, etc.). Isso imprime um traço de cada linha executada. Se você quiser rastrear apenas parte de um script, use set -x
para ativar os rastreamentos e set +x
para desativá-los. Zsh tem melhores traços que os outros, mas tem sintaxe incompatível; você pode dizer ao zsh para esperar a sintaxe sh com o comando emulate sh 2>/dev/null
(que não tem efeito em outros shells).