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
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, masenv | 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?
$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 executarsource <perlbrew path>/perlbrew/etc/cshrc
antes de executarperlbrew use
. Resolvi isso inserindosetenv SHELL /bin/csh
no perlbrew cshrc.