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).