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 / ubuntu / Perguntas / 1411833
Accepted
MDeBusk
MDeBusk
Asked: 2022-06-02 19:19:11 +0800 CST2022-06-02 19:19:11 +0800 CST 2022-06-02 19:19:11 +0800 CST

O que vai em ~/.profile e ~/.bashrc?

  • 772

Estou tendo problemas para entender o que pertence ~/.profilee o que pertence ao ~/.bashrc.

Pelo que li, parece -me que ~/.profiledeve ser usado para variáveis ​​de ambiente e ~/.bashrcpara aliases, funções e afins. Se eu mover todas as minhas exportinstruções de ~/.bashrcpara ~/.profile, tudo funcionará como deveria ou estou prestes a quebrar alguma coisa?

(Aqui está meu repositório dotfiles se você quiser examinar os dois arquivos.)

EDIT 2022-06-03: Mudei a maioria das minhas variáveis ​​de ambiente de ~/.bashrcpara ~/.profilee me assegurei de que ~/.bash_profilesources ~/.profile. As únicas variáveis ​​de ambiente que deixei ~/.bashrcsão aquelas que só importam quando estou trabalhando em um shell, por exemplo, aquelas pertencentes a menos, os prompts, slrn e similares. Tudo parece estar funcionando bem. Obrigado pela ajuda.

bashrc
  • 3 3 respostas
  • 2756 Views

3 respostas

  • Voted
  1. Best Answer
    chepner
    2022-06-03T05:46:09+08:002022-06-03T05:46:09+08:00

    Isso ajuda a entender quais arquivos são originados quando e por quê .

    .profileé originado por um shell de login na inicialização. Normalmente, o único shell de login que você inicia é aquele iniciado quando você faz login, mas você pode executar um shell de login a qualquer momento com bash -l. (Além disso, no macOS, não há shell de login inicial, então os emuladores de terminal tendem a executar um shell de login para cada nova janela.)

    .profileé um local ideal para definir variáveis ​​de ambiente que podem ser herdadas por qualquer programa iniciado a partir do shell de login.

    .bashrc, por outro lado, é originado por shells interativos sem login, como aqueles iniciados por janelas de terminal. É aqui que você define as coisas específicas do seu shell interativo que não são herdadas do processo pai. Por exemplo, PS1é definido aqui porque apenas shells interativos se preocupam com seu valor, e qualquer shell interativo será fonte .bashrcde qualquer maneira, portanto, não há necessidade de definir e exportar PS1de .profile.

    E embora você não tenha perguntado, vale a pena apontar a diferença entre .profilee .bash_profileaqui. .profileé "compartilhado" por todos os shells POSIX (como dash), portanto, não coloque nada bashespecífico aqui. .bash_profile, no entanto, é usado apenas por bash, portanto, você pode usar bashextensões nele. Se .bash_profileestiver presente, .profileserá ignorado, portanto, se por qualquer motivo você quiser usar os dois, poderá adicionar . ~/.profileao topo do seu arquivo .bash_profile.

    • 26
  2. Terrance
    2022-06-02T19:49:16+08:002022-06-02T19:49:16+08:00

    ~/.profileé chamado apenas quando você faz login pela primeira vez em sua conta. Quaisquer alterações que você fizer depois disso, seria aconselhável sair e voltar para que as configurações tenham efeito. ~/.bashrcé chamado toda vez que você inicia uma janela de terminal. Existe outro profilearquivo e está no /etc/diretório. A principal diferença entre os dois é que o /etc/profileé chamado quando alguém faz login no sistema e o ~/.profileé chamado quando apenas o usuário faz login.

    Se suas exportlinhas forem usadas apenas em uma sessão de terminal, eu as adicionaria ao ~/.bashrcarquivo, pois elas são válidas apenas durante a sessão do terminal (bash). Mas, se você quiser que eles estejam lá com ou sem um terminal aberto, adicione-os ao ~/.profilearquivo, mas, como @chepner afirmou, não coloque comandos específicos do bash no ~/.profilearquivo.

    Se você estragar esses arquivos, existem arquivos padrão armazenados no /etc/skel/diretório que você pode copiar de volta para o seu diretório pessoal. Além disso, os /etc/skel/arquivos também são usados ​​quando você inicializa em um LiveUSB/CD/DVD, portanto, se você modificá-los em sua mídia ao vivo e, quando concluir a inicialização, poderá ter suas próprias variáveis ​​definidas.

    • 13
  3. cjs
    2022-06-03T19:10:39+08:002022-06-03T19:10:39+08:00

    a resposta de chepner cobre os princípios gerais. Existem algumas outras sutilezas que você deseja observar.

    Primeiro, os shells de login não originam , .bashrcmesmo que sejam interativos. Assim, você provavelmente quer um .bash_profileque contenha código como o seguinte:

    interactive() { [[ $- = *i* ]]; }
    interactive && . $HOME/.bashrc || echo 1>&2 "ERROR: .bashrc failed with retval $?"
    

    Isso não fará muita diferença em um login de console em um ambiente gráfico, mas fará muita diferença em um console de texto ou login ssh.

    Você não precisa necessariamente fazer o teste interativo; Eu realmente fonte .bashrcmesmo para shells não interativos (embora isso não seja uma boa ideia em algumas circunstâncias).

    Observe que, se você também usar shells não Bash, também precisará de um .profilecom quaisquer variáveis ​​de ambiente etc. que desejar para eles. O Bash irá ignorar o seu .profilequando você tiver um .bash_profile, mas é claro que o último pode fornecer o primeiro.


    Nem todo login novo (ou seja, um shell criado não por seu id de usuário, mas por um processo root que o autenticou) é considerado um "shell de login". Em particular, dar um comando para uma invocação ssh ( ssh somehost.example.com 'echo $-') não será um "shell de login" e .bash_profile/ .bash_login/ .profilenão será originado. Aqui está uma tabela mostrando o que é considerado um "login" ou shell interativo e o que é executado para várias invocações

    Estado Invocação
    Entrar ( L ) argv[0][0] == '-',--login
    Interativo ( eu ) -i, stdin é tty
    Remoto ( R ) stdin é "conexão de rede" (veja abaixo)
    • '•' = definido; em branco = não definido; '-' = não marcado ou não se importa.
    • inh : Herda o ambiente de um pai (diferente de init); ou seja, não é um "login fresco" e o pai pode esperar que o ambiente seja mantido intacto.
    • p : fontes /etc/profile então primeiro de ~/.bash_profile, ~/.bash_login,~/.profile
    • rc : fontes /etc/bash.bashrcentão~/.bashrc
    eu EU R inh p rc Exemplo
    • • - • ssh host.com(sshd define argv[0]="-bash")
    • - • ssh host.com </dev/null(sshd define argv[0]="-bash")
    • • • bash -i, bashem tty
    • bash hello.sh, bash -c echo foo,
    • • ssh host.com 'echo $-'(ssh é executado bash -c 'echo $-)

    A tabela vem deste documento ; há algumas informações adicionais lá que também podem ser úteis. (Qualquer pessoa que sinta que algo deve haver nesta resposta deve se sentir à vontade para editá-la e copiá-la.)

    • 8

relate perguntas

Sidebar

Stats

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

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

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