O script shell funciona diretamente, mas tem um erro de sintaxe via crontab

1

Eu tenho um script de shell para automatizar um git commit e empurrar todas as noites:

auto_git_push.sh

#!/bin/sh

function automate(){
    git add .
    git commit -am "automated push $(date +"%Y-%m-%d")"
    git push -u
}

cd ~/htdocs
automate

Se eu executar este comando, o script funcionará como esperado: . ~/bin/auto_git_push.sh

No entanto, com esta linha crontab (definida para cada minuto para testes)

* * * * * sh /home/hookedonwinter/bin/auto_git_push.sh

Eu recebo o seguinte erro:

/home/hookedonwinter/bin/auto_git_push.sh: 3: Syntax error: "(" unexpected

O que está causando esse erro de sintaxe?

Obrigado!

Edite com base na resposta aceita:

Alterou o script para:

#!/bin/bash

automate() {
    git add .
    git commit -am "automated push $(date +"%Y-%m-%d")"
    git push -u
}

cd ~/htdocs
automate

E a linha crontab para:

* * * * * /bin/bash /home/hookedonwinter/bin/auto_git_push.sh

    
por hookedonwinter 30.01.2013 / 19:30

3 respostas

3

Como John mencionou, é uma questão de seu script ser interpretado de forma diferente nos dois ambientes (usando /bin/sh under cron e usando o shell existente, que provavelmente é /bin/bash quando você o origina diretamente) . Na verdade, /bin/sh geralmente é apenas um link simbólico para /bin/bash , e o executável bash se comporta de maneira diferente dependendo do nome sob o qual foi invocado, mas isso é apenas um aparte.

Aqui, a maneira mais fácil de corrigir seu problema provavelmente é apenas especificar

/bin/bash /home/hookedonwinter/bin/auto_git_push.sh

como o comando a ser executado no cron.

    
por 30.01.2013 / 20:18
2

O ambiente cron está interpretando o comando inlined diferentemente do seu ambiente de shell. Eu estou supondo que seu shell é / bin / bash, o que significa que ele está sendo executado em um shell diferente inteiramente do cron no cron (a construção "." Lê o fluxo de comando no shell, ele não invoca o shell no shebang linha). Eu não tenho certeza qual sintaxe você precisa usar em / bin / sh, mas eu começaria tentando simples backticks no lugar do $ (e). Depois de encontrar algo que funcione, você poderá usá-lo ou continuar pesquisando algo mais atraente para sua estética.

    
por 30.01.2013 / 19:34
1

Existem 2 shells diferentes no trabalho aqui. /bin/sh é o shell POSIX (sintaxe baseada no shell Bourne). /bin/bash é o Bourne Again Shell , a.k.a. Bash. É compatível com POSIX, mas adiciona sua própria sintaxe, entre outras coisas. Dependendo da configuração do sistema, /bin/sh pode ser um link simbólico para outro shell compatível com POSIX, como traço ou ash . O ponto importante é que ele espera sintaxe de shell POSIX , sem extras de Bash.

No script Bash, as funções podem ser declaradas com a palavra function reservada, o que torna os parênteses opcionais. Isso significa que no Bash, as seguintes declarações de função são válidas:

function foo() { true; }
function bar { true; }
baz() { true; }

Mas, de acordo com a sintaxe do shell POSIX, somente o último, baz() { true; } , é válido.

Com base na resposta escolhida para essa pergunta, você pode ver que invocar o script diretamente com /bin/bash fará com que o Bash interprete seu script, sem problemas. Para referência futura, no entanto, use somente a sintaxe POSIX em scripts que iniciam com uma #!/bin/sh shebang e use #!/bin/bash para scripts que contenham sintaxe específica de Bash.

    
por 30.01.2013 / 21:00

Tags