Por que a fonte do Mac OS X não ~ / .bashrc? [duplicado]

95

Esta pergunta já tem uma resposta aqui:

Eu encontrei muitas pessoas descobrindo por que instruções semelhantes a esta:

Put X to your ~/.bashrc and you can do Y

não trabalha

Sempre acontece que os arquivos de inicialização do bash do Mac OS X (ou o próprio Bash do Mac) não originam arquivos ~ / .bashrc, no shell de login ou em um shell gerado no sistema de janelas - como o aplicativo Terminal no Mac OS X)

Por que isso, quando todos os outros sistemas Unix-like com Bash com os quais trabalhei antes fizeram isso?

PS:

Eu descobri o que o próprio Bash diz sobre arquivos de inicialização (o que pode ser útil):

Quando o Bash é chamado como um shell de login interativo ou como um shell não interativo com a opção --login, ele primeiro lê e executa comandos do arquivo / etc / profile, se esse arquivo existir. Depois de ler esse arquivo, ele procura ~ / .bash_profile, ~ / .bash_login e ~ / .profile, nessa ordem, e lê e executa comandos do primeiro que existe e é legível. A opção --noprofile pode ser usada quando o shell é iniciado para inibir esse comportamento.

Fonte: http://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files

Paul Brewczynski
fonte
Notei também que ~/.bash_profileé executado, mas não ~/.bashrc. Estranho.
Izurav

Respostas:

90

Por padrão, no OSX, o terminal inicia uma sessão de logon para ler .bash_profile etc. (o processo de login da GUI que solicita seu nome e senha não usa scripts de shell e não inicia nenhum shell, tudo é feito no launchd e na área de trabalho)

Em outros Unices, o xterm executa um shell sem login por padrão para que eles leiam .bashrc, pois os scripts que apresentam sua senha etc. no login chamam a sessão de login e todos os terminais são subprocessos e herdam o ambiente do shell.

No documento GNU a que você se referiu

Chamado como um shell interativo sem logon

Quando um shell interativo que não é um shell de login é iniciado, o Bash lê e executa comandos de ~ / .bashrc, se esse arquivo existir. Isso pode ser inibido usando a opção --norc. A opção --rcfile file forçará o Bash a ler e executar comandos do arquivo em vez de ~ / .bashrc.

Então, normalmente, seu ~ / .bash_profile contém a linha

if [ -f ~/.bashrc ]; then . ~/.bashrc; fi 

depois (ou antes) de qualquer inicialização específica de login.

user151019
fonte
7
Unicies = Unixes?
Paul Brewczynski
8
Bem, Unices, eu quis dizer - inclinei o latim na escola para remover a forma plural - veja en.wikipedia.org/wiki/Unix
user151019
8
... e a terceira forma "Unixen" (embora eu prefira Unices)
earcam
7
e quarto "Unicórnios" ...
tink
8
não vamos esquecer a forma nula, ou seja, "eunucos"
smatthewenglish
19

bashlê apenas .bashrcpara shells que não são de login :

Quando um shell interativo que não é um shell de login é iniciado, o bash lê e executa comandos de ~ / .bashrc, se esse arquivo existir. Isso pode ser inibido usando a opção --norc. A opção --rcfile file forçará o bash a ler e executar comandos do arquivo em vez de ~ / .bashrc.

Quando o Terminal inicia bashcomo um shell de login (execute wpara verificar se as bashinstâncias são executadas como -bash), .bashrcnunca é lido automaticamente.

nohillside
fonte
Portanto, o ponto é que esse aplicativo Termina no Mac OS X sempre cria uma instância de "login" do bash? Por quê ? Se você realmente não faz login. (Você fez o login anteriormente a partir da GUI)
Paul Brewczynski
Por que outros sistemas unix lêem ~ / .bashrc?
Paul Brewczynski
3
Ninguém aqui está em posição de explicar as decisões de design tomadas pela Apple. Eu poderia argumentar facilmente dos dois lados, mas isso também não ajuda. Portanto, apenas aceite-o como é provavelmente a melhor opção
nohillside
Bem, é a primeira vez que executar o shell como você, por isso é um login, no X11 baseado Unices você começa executando o shell que então corre X para que ele não é um login
user151019
@PaulBrewczynski Bem, o Linux recebeu uma chamada de .bash_profile para .bashrc.
Paul Stelian