AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 429232
Accepted
林果皞
林果皞
Asked: 2018-03-10 04:20:48 +0800 CST2018-03-10 04:20:48 +0800 CST 2018-03-10 04:20:48 +0800 CST

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

  • 772

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 obter a variável de ~/.bashrc.

O motivo é porque o daemon como um processo em segundo plano significa que não é interativo, enquanto ~/.bashrc é usado apenas em sessões interativas, para evitar alias cp='cp -i'casos .

E o mais recente ~/.bashrctem o safe guard em cima do arquivo não permite chamador não interativo, ou seja, sem -iopção retornará antes:

# ~/.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)

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

Existe alguma razão ou restrição de por que o bashrc não suporta não interativo dessa maneira ou de qualquer outra maneira? OU estou entendendo mal alguns conceitos?

environment-variables bashrc
  • 2 2 respostas
  • 2773 Views

2 respostas

  • Voted
  1. dan
    2018-03-10T04:57:09+08:002018-03-10T04:57:09+08:00

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

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

    Claramente, a função desse script de shell é iniciar o ambiente que deve ser alterado em todos os níveis do 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 a esse uso.

    Para sessões interativas, bashprocurará 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, bashnão use nenhum dos arquivos acima, mas leve em consideração a variável dedicada BASH_ENV(consulte a resposta de Kusalananda ).

    • 3
  2. Best Answer
    Kusalananda
    2018-03-10T04:46:52+08:002018-03-10T04:46:52+08:00

    Você já tem a oportunidade de definir BASH_ENVo nome do caminho de um arquivo que o shell script 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 mesmo

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

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

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

    No entanto, se um script precisar de variáveis ​​específicas definidas, como JAVA_HOMEetc., pode ser uma ideia melhor definir BASH_ENVexplicitamente um script por script, ou obter explicitamente o arquivo relevante de dentro do próprio script ou apenas definir o variáveis ​​no script. Coletar todas as coisas que qualquer shell não interativo pode querer usar em um único arquivo pode desacelerar os scripts e potencialmente também poluir o ambiente dos scripts com coisas que eles não precisam.

    • 2

relate perguntas

  • Encontre o caminho de onde a variável $CDPATH está localizada?

  • definir o caminho do diretório de inclusão (para *.h) CentOS

  • O arquivo .bash_completion em $HOME impede o login

  • $PAGER pode conter espaços?

  • Posso definir manualmente vários proxies no ambiente?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve