Como chamar uma função dentro de um script bash em Raspbian?

1

Eu tenho esse script que uso no Centos por muitos anos. Eu estou chamando o mesmo script em Raspberry Pi agora e recebo este erro:

/media/Backups/backup_all.sh: 2: /media/Backups/backup_all.sh: source: not found
/media/Backups/backup_all.sh: 7: /media/Backups/backup_all.sh: function: not found

Este é o script que está em um arquivo chamado backup_all.sh. Eu chamo da linha de comando e cron usando sh backup_all.sh.

#!/bin/sh
function backup
{
    sh "/media/Backups/backup.sh" $1 $2 filter-list.txt
}
backup myserverhostname.com 22

Eu também tentei colocar source backup.sh ou "source /media/Backups/backup.sh" no topo e não funcionou.

O mais estranho é que ele realmente chama o script backup.sh porque eu recebo mais erros disso.

Se eu chamar o script de origem diretamente da linha de comando (por exemplo, sh "/media/Backups/backup.sh" myserverhostname.com 22 filter-list.txt), ele executa OK, então eu não acho que há erros lá .

Se eu não usar a função e apenas chamar sh "/media/Backups/backup.sh" myserver 22 filter-list.txt no arquivo backup_all.sh, então isso também funciona OK. Então, parece ser apenas quando usado em uma função.

Para informações estou incluindo o script dentro de outro script, porque eu iterar através de muitos servidores para executar esta função, então eu chamo a função de backup neste arquivo, muitas vezes, foi mais fácil do que chamá-lo especificamente para cada servidor. Mas para fazer isso funcionar eu estou removendo a função e chamando cada linha separadamente, mas seria bom descobrir por que eu não posso usar a mesma função que no Centos.

    
por Laurence Cope 13.09.2017 / 10:45

1 resposta

2

Parece que /media/Backups/backup.sh é um script Bash em vez de um shell script padrão (POSIX). Da mesma forma, a sintaxe para backup_all.sh é válida apenas para o Bash.

No Bash source é um arquivo embutido e function é uma palavra-chave do shell, mas eles não são especificados no padrão POSIX para sh , o interpretador de comandos shell. O shebang em seus scripts é #!/bin/sh , que instrui o kernel a usar /bin/sh para interpretar o script.

O motivo pelo qual o shell script trabalhou com o CentOS é que as distribuições baseadas no Red Hat criam /bin/sh como um link simbólico para /bin/bash . O Bash é (principalmente) compatível com o POSIX, mas estende seus recursos de várias maneiras. Com derivativos recentes do Debian (como Raspbian), /bin/sh é um link simbólico para /bin/dash , um shell POSIX que é mais rígido em sua compatibilidade (mas também mais leve e rápido que o Bash). É por isso que os seguintes erros estão sendo lançados pelo interpretador de scripts:

/media/Backups/backup_all.sh: 2: /media/Backups/backup_all.sh: source: not found
/media/Backups/backup_all.sh: 7: /media/Backups/backup_all.sh: function: not found

Isso pode ser corrigido por:

  1. Especificando explicitamente o Bash como o interpretador na sua função backup() como bash /media/Backups/backup.sh "$1" "$2" filter-list.txt (observe que as variáveis são citadas).
  2. Especificando explicitamente o Bash como o shebang para backup_all.sh (e backup.sh )

    #!/bin/bash
    

Como alternativa, reescreva ambos os scripts para serem compatíveis com POSIX e continue usando /bin/sh como o interpretador. Veja o artigo wiki do Ubuntu, Traço como / bin / sh para mais informações sobre isso.

    
por 13.09.2017 / 13:06

Tags