Por que tal versão não interativa do bashrc?

0

Pelo que entendi, um daemon é um processo em segundo plano, mas o daemon requer um arquivo de configuração exclusivo para definir a variável de ambiente.

Por exemplo O daemon do Hadoop requer hadoop-env.sh para definir a variável de ambiente JAVA_HOME , você não pode simplesmente pegar a variável de ~/.bashrc .

O motivo é que o daemon como um processo de segundo plano significa que ele não é interativo, enquanto o ~ / .bashrc é usado apenas a partir da sessão interativa, para evitar alias cp='cp -i' case .

E o último ~/.bashrc tem a proteção segura no topo do arquivo não permite o chamador não interativo, ou seja, sem -i a opção retornará cedo:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Isso me faz pensar por que o bashrc não divide os arquivos de configuração em 3 grupos, como:

  • ~ / .bashrc_interactive

  • ~ / .bashrc_non_interactive

  • ~ / .bashrc_global # (interativo e não interativo)

Assim, o usuário pode simplesmente definir JAVA_HOME em ~/.bashrc_non_interactive ou ~/.bashrc_global , e não é necessário adicionar essa variável de ambiente em cada arquivo daemon, repetidamente.

Existe alguma razão ou restrição do porquê o bashrc não suporta não-interativo dessa maneira ou de outra maneira? OU estou entendendo mal alguns conceitos?

    
por 林果皞 09.03.2018 / 13:20

2 respostas

1

Você já tem a oportunidade de definir BASH_ENV para o nome do caminho de um arquivo que o script de shell não interativo analisa antes de executar.

Isso permite que você faça, em um crontab, por exemplo

@hourly BASH_ENV="$HOME/.bashrc_non_interactive" "$HOME/bin/mybashscript"

ou até mesmo

BASH_ENV="$HOME/.bashrc_non_interactive"

@hourly "$HOME/bin/mybashscript"
@daily  "$HOME/bin/myotherbashscript"

$BASH_ENV geralmente está vazio, mas não há nada que o impeça de configurá-lo globalmente em seu servidor, apontando para um arquivo em /etc que faz

if [ -f "$HOME/.bashrc_non_interactive" ]; then
    . "$HOME/.bashrc_non_interactive"
fi

No entanto, se um script precisar de conjunto de variáveis específicas, como JAVA_HOME etc., talvez seja melhor definir BASH_ENV explicitamente em um script por script ou originar explicitamente o arquivo relevante de dentro o script em si, ou apenas definir as variáveis no script. Coletar todas as coisas que qualquer shell não interativo pode querer usar em um único arquivo pode retardar os scripts e potencialmente também poluir o ambiente dos scripts com coisas que eles não precisam.

    
por 09.03.2018 / 13:46
1

A função de concepção do arquivo ~/.bashrc é iniciar corretamente qualquer shell que seja:

  • não é o shell de login,
  • um shell interativo.

É evidente que a função deste script de shell é iniciar o ambiente que deve ser alterado em todos os níveis de shell, por exemplo, PS1 .

Não é adequado para definir uma sessão ou um ambiente de daemon.

Existem outros scripts de shell que são dedicados para tal uso.

Para sessões interativas, bash procurará arquivos de inicialização nesta ordem:

  • /etc/profile
  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile

Para sessões não interativas, por exemplo, para iniciar um daemon, bash não está usando nenhum dos arquivos acima, mas está levando em consideração a variável dedicada BASH_ENV (consulte Kusalananda answer ).

    
por 09.03.2018 / 13:57