Shebang não configura SHELL no cron

5

Eu tenho um script que contém:

#!/bin/bash
printenv

Quando eu o executo na linha de comando:

env testscript.sh
bash testscript.sh
sh testscript.sh

sempre, gera SHELL=/bin/bash . No entanto, quando é executado a partir do cron, ele sempre gera SHELL=/bin/sh . Por que é isso? Como posso fazer o cron aplicar a shebang?

Eu já verifiquei o PATH do cron; inclui / bin.

    
por Benubird 15.07.2015 / 16:49

3 respostas

4

O shebang está funcionando e o cron não tem nada a ver com isso. Quando um arquivo é executado, se o conteúdo desse arquivo começa com #! , o kernel executa o arquivo especificado na linha #! e passa o arquivo original como um argumento.

Seu problema é que você parece acreditar que SHELL em um script de shell reflete o shell que está executando o script. Este não é o caso. De fato, na maioria dos contextos, SHELL significa o shell interativo preferido do usuário, ele é destinado a aplicativos como o emulador de terminal para decidir qual shell executar. No cron, SHELL é a variável que informa ao cron qual programa usar para executar as entradas do crontab (a parte das linhas após as indicações de tempo).

Os shells não definem a variável SHELL , a menos que ela não esteja definida quando eles são iniciados.

O fato de que SHELL é /bin/sh é muito provavelmente irrelevante. Seu script tem uma linha #!/bin/bash , então é executado por bash. Se você quiser se convencer, adicione ps $$ no script para fazer ps mostrar informações sobre o shell que está executando o script.

    
por 16.07.2015 / 02:55
1

Manual de referência do Bash diz:

SHELL - The full pathname to the shell is kept in this environment variable. If it is not set when the shell starts, Bash assigns to it the full pathname of the current user’s login shell.

man 5 crontab diz:

Several environment variables are set up automatically by the cron(8) daemon. SHELL is set to /bin/sh, and LOGNAME and HOME are set from the /etc/passwd line of the crontab's owner. PATH is set to "/usr/bin:/bin". HOME, SHELL, and PATH may be overridden by settings in the crontab

Portanto, a variável SHELL é definida quando o Bash é iniciado.

Experimente SHELL=/bin/awesome/shell bash testcript.sh . Você deve ver SHELL=/bin/awesome/shell

Shebang trabalha. Você tem um comportamento documentado:)

    
por 15.07.2015 / 20:12
-1

Altere o shebang para

#!/bin/env bash

Ou execute crontab -e para que o script seja executado com suas próprias variáveis de ambiente, pois as próprias do cron são diferentes.

Como uma nota secundária, de acordo com este post no askubuntu , você precisa fornecer seu cron a PATH no topo do script:

PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# rest of script follows

No entanto, considerando que você disse que o PATH parece ter os diretórios de pesquisa apropriados, você pode descartá-lo.

    
por 15.07.2015 / 20:15