Evite fazer o sourcing de scripts várias vezes

3

No momento, quando abro um terminal no meu Mac, ele chama automaticamente:

source ~/.bash_profile .

O que me preocupa, no entanto, é que meu shell não parece herdar parte do conteúdo de ~/.bashrc ou ~/.profile . Mas isso pode ser típico.

Eu tenho vários scripts para herdar usando source ou . ; se eu colocar essas chamadas em ~/.bash_profile , pode levar algum tempo para carregar uma nova janela de shell, às vezes 3 ou 4 segundos, e isso fica obsoleto. Eu imagino que há alguma maneira de obter esses scripts apenas uma vez e ter meu arquivo ~/.bash_profile herdado de alguma forma.

Note que a origem de chamada ~ / .bashrc ou source ~ / .profile do meu ~ / .bash_profile não é o que eu quero fazer, e provavelmente também é uma má ideia. Não é o que eu quero fazer porque não resolve o problema de uma carga lenta para cada novo shell.

Adicionei algumas instruções de eco; toda vez que eu abro uma nova janela de terminal bash, isso é registrado:

starting to load /etc/profile
finished loading /etc/profile
starting to load bash_profile
finished loading bash_profile

isso faz sentido, mas o que é desanimador - eu realmente preciso carregá-los toda vez que um novo shell é aberto? Por que não pode fazer alguma herança sofisticada para que não tenhamos que recarregar tudo o tempo todo?

Eu criei um vídeo demonstrando o problema. Eu tenho 4 aplicativos de terminal que uso regularmente:

terminal.app                  # misbehaves
iterm2                        # misbehaves
webstorm terminal emulator    # misbehaves
vscode terminal emulator      # behaves!

O VSCode realmente se comporta da maneira que eu desejaria. Eu estou supondo que ele faz isso carregando ~ / .bash_profile em um shell pai, e fazendo isso apenas uma vez, quando o vscode inicializa. Todas as janelas do terminal no aplicativo são, em seguida, subcamadas desse shell pai.

Espero que este vídeo torne o assunto claro: link

Esta é uma questão legítima - a maioria dos aplicativos de terminal faz tudo errado, no entanto, milagrosamente, parece que o VSCode da Microsoft realmente faz tudo isso da maneira certa, veja esta questão:

link

    
por Alexander Mills 21.02.2018 / 21:52

2 respostas

1

Esta manhã, movi um monte de informações pessoais do meu bash_profile e bashrc e as adicionei a um novo arquivo que chamo de privaterc .

No meu arquivo privaterc eu configurei esta variável:

PRIVATERC_RUN=yes 

Agora, no meu bash_profile , adicionei esta linha:

[[ $PRIVATERC_RUN != yes && -f ~/.privaterc ]] && source ~/.privaterc

Isso fará com que privaterc seja originado somente se não tiver sido originado anteriormente neste shell.

Também quanto à estranheza do perfil que você está vendo, o artigo que eu vinculei no comentário afirma o seguinte sobre o mac:

Mac OS X — an exception

An exception to the terminal window guidelines is Mac OS X’s Terminal.app, which runs a login shell by default for each new terminal window, calling .bash_profile instead of .bashrc. Other GUI terminal emulators may do the same, but most tend not to.

    
por 21.02.2018 / 22:15
1

Coloque uma variável exclusiva no arquivo rc - com um comprimento de 1 ou mais bytes - e verifique se ela tem um comprimento maior que 0 antes de obter o bash_profile.

if [ ! X”” = X”$uniq_var” ] ; then . ~/.bash_profile ; fi

Acabei de definir o bash como o shell de login no MacOS e não tive esse problema. Talvez eles tenham mudado alguma coisa novamente.

    
por 21.02.2018 / 22:21