O que faz com que um script csh às vezes não forneça o /etc/csh.cshrc?

2

Eu tenho um script de pós-instalação csh que é executado a partir de um rpm %post com sua linha de intérprete configurada como #!/bin/csh (sem a opção -f ). Isso deve fazer com que o arquivo /etc/csh.cshrc seja lido antes de executar o restante do script, de acordo com as páginas de manual de ambos bsd-csh (1) e tcsh (1) Eu tenho certas definições de variáveis e alias de ambiente em todo o sistema em /etc/csh.cshrc , das quais o script depende para funcionar corretamente. O comportamento esperado é que, quando o csh executa o script, ele escolhe as definições do sistema primeiro e o script é executado com êxito.

Isso funciona, pelo menos inicialmente sob certas condições. O script csh é sempre chamado da mesma maneira na seção rpm %post . No entanto, dependendo de como a instalação do aplicativo rpm é executada, o script pode não selecionar as variáveis esperadas e o erro, então parece que provavelmente ele não está obtendo /etc/csh.cshrc . A instalação pode ser feita em um shell de login raiz, via sudo, sobre ssh, do cron ou iniciada de algum outro processo. Pelo menos um deles introduz alguma diferença que impede que /etc/csh.cshrc seja originado. Eu não vejo nada nas páginas man além da opção -f que causaria isso.

    
por Mike Miller 01.05.2014 / 06:18

1 resposta

2

Acontece que a diferença é uma variável de ambiente $HOME ausente. Quando $HOME não está definido no ambiente, nenhum arquivo de inicialização é originado por csh ou tcsh. A falta de uma variável $HOME é interpretada por csh exatamente como se ela tivesse recebido a opção de linha de comando -f .

Isso faz sentido ao considerar os arquivos de inicialização do shell ~/.cshrc e ~/.login no diretório inicial do usuário. Se $HOME não estiver definido, esses arquivos específicos do usuário não poderão ser carregados. Mas o csh simplesmente pula procurando por todos os arquivos de inicialização, tanto do sistema quanto do usuário, quando $HOME não está definido.

Definir $HOME para qualquer diretório válido antes de executar o script csh, seja o diretório home real do usuário ou até mesmo um diretório temporário vazio, torna a origem csh /etc/csh.cshrc como esperado.

Eu não encontrei nenhuma documentação para explicar ou descrever este recurso, mas o código-fonte tanto para o bsd-csh quanto para o tcsh confirma esse comportamento.

    
por 01.05.2014 / 06:18

Tags