Por que SHELL é apontado para / bin / sh em um script Csh?

Sim, eu sei que o C-shell é ruim. Não, eu não escolhi o C-shell. Sim, prefiro usar uma concha adequada. Não, não posso mudar para um shell melhor.

Eu tenho um script muito simplista:

/tmp/env_test.csh

#!/bin/csh -f env 

Quando executo este script do meu usuário que está conectado com um shell tcsh, SHELL é igual a /bin/tcsh. Quando executo este script a partir do cron, SHELL é igual a /bin/sh.

Por que o SHELL não está sendo atualizado adequadamente? O que preciso fazer para resolver esse problema?

Comentários

  • Por que é um problema mesmo assim?
  • @muru depois de tropeçar nisso e encontrar uma solução, parece que ' é um problema porque o perlbrew não ' t aparentemente de maneira apropriada " sense " o shell é [t] csh se $SHELL não estiver definido para o shell correto. Quando o cron é executado usando /bin/sh, $SHELL=/bin/sh, mesmo depois de iniciar um script C-shell (#!/bin/csh -f). Perlbrew então assume que ' é um shell Bourne e usa comandos do shell Bourne para configurar o ambiente. Isso acontece apesar de executar source <perlbrew path>/perlbrew/etc/cshrc antes de executar perlbrew use. Resolvi isso inserindo setenv SHELL /bin/csh no perlbrew cshrc.

Resposta

Procure em man 1 csh. A seção Pre-defined and environment variables lista quais variáveis csh define ou respeita. Há uma variável shell em minúsculas:

 shell The file in which the shell resides. This variable is used in forking shells to interpret files that have execute bits set, but which are not executable by the system. (See the descrip- tion of Non-builtin Command Execution below.) Initialized to the (system-dependent) home of the shell. 

Então, vamos dar uma olhada:

% echo $shell /bin/csh 

Comentários

  • Então, pelo que posso dizer após uma série de testes, $ shell não é um ambiente verdadeiro variável, mas sim uma variável interpretada por shell. echo $shell retorna /bin/tcsh do script, mas env | grep -i shell não encontra a variável correta no cron. Pelo que entendi de outros lugares (como esta resposta ), $SHELL deve ser definido. Na verdade, em meu shell de login ativo, é. O único lugar que eu não ' t get $SHELL é cron.

Resposta

Você deve definir a variável SHELL para /bin/csh em seu crontrab, você pode verificar a variável de ambiente cron através de:

* * * * * env > ~/cron-env tail -f ~/cron-env 

O SHELL padrão deve ser definido como /bin/sh.

SO: Como simular o ambiente com que o cron executa um script?

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *