Questão Script bash do Ubuntu: o shell está mudando sem nenhum motivo


Estou tendo um comportamento estranho com um script de shell no Ubuntu 12.04.1 LTS.

Meu script está programado para ser lançado a cada hora (em crontab). Ele usa / bin / bash, mas às vezes muda para / bin / sh sem nenhum motivo.

Aqui estão algumas partes do comando env que estou registrando no script.

O correto é:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/jdk/jdk1.6.0_35/bin

O errado que às vezes ocorre é:

SHELL=/bin/sh
PATH=/usr/bin:/bin

O problema é que estou perdendo a variável PATH e recebo um erro quando tento executar um comando.

Alguma dica? Obrigado!


0


origem


Você começou seu roteiro com #!/bin/bash?
O primeiro $ PATH é o único para o seu usuário, o segundo $ PATH é o único para o cron. Faça um pequeno wrapper cron que lance / bin / bash e configure o seu $ PATH esperado. - cdleonard


Respostas:


É difícil dizer por que às vezes funciona e às vezes não. Então, aqui estão algumas idéias que podem ou não ajudar.

Verifique se o seu script começa com

#!/bin/bash

e certifique-se de que o script seja executado com o usuário correto: Isso fará com que o bash carregue o ambiente correto para esse usuário.

Se você quiser ter certeza, você também pode executar explicitamente bash na tua crontab, em seguida, passe o script para executar com o -c argumento.

Se isso não ajudar e você precisar de uma solução rápida, poderá optar por executar os comandos em seu script usando o caminho completo, para não precisar da correção correta. PATH em absoluto.

Nota: Esta questão se encaixaria melhor no Server Fault ou Unix e Linux.


2



Obrigado, o script começa com a declaração / bin / bash. No entanto, já encontrei algumas soluções alternativas para corrigir o problema, como as que você está sugerindo. Eu não posso explicar por que isso acontece de qualquer maneira ... - Angelo Cavallini


Coloque isso no início do seu script:

#!/bin/bash
if [ "$(readlink -f /proc/$$/exe)" != "/bin/bash" ] ; then
    echo restarting script with bash... > &2
    exec /bin/bash $0 "$@"
fi

0





o SHELL variável é o shell de login, não necessariamente o shell no qual você está executando atualmente.

O motivo mais provável para as diferenças é que às vezes você está executando a partir de um shell interativo e, às vezes, não (cron), em cada caso, os arquivos de inicialização executados são diferentes.

Quando você roda sob cron não é um shell de login, então seu .profile não está sendo executado - a razão mais provável pela qual PATH é diferente.

No início do seu script, coloque:

source ~/.profile

(ou use . ao invés de source)


0