debian: leitura da ordem dos arquivos de configuração da sessão bash inconsistentes

0

Os três arquivos são lidos nesta ordem?

.bash_profile
.profile
.bashrc

Isso não está acontecendo quando abro um terminal pela primeira vez.

Eu tenho instruções de rastreamento nos arquivos anexados ao arquivo init.log. Por favor, dê uma olhada no seguinte. Começa depois de abrir um terminal. Eu coloquei um comentário para mostrar onde o log pega após o comando su.

stephen@debian:~$ cat init.log
reading .bashrc
done reading .bashrc
stephen@debian:~$ su - stephen
Password: 
stephen@debian:~$ cat init.log
reading .bashrc
done reading .bashrc
#
# after su
#
reading .bash_profile
reading .profile
reading .bashrc
done reading .bashrc
done reading .profile
done reading .bash_profile
stephen@debian:~$ 

Assim, o su-login aciona a sequência esperada, no entanto, o login inicial lê apenas o bashrc. Isso não pode estar correto. Alguém pode explicar sob quais condições isso ocorreria? Eu poderia modificar os arquivos bashrc e profile para que a leitura inicial incluísse todos os arquivos esperados, mas eu preferiria chegar à raiz do problema e corrigi-lo lá.

    
por Stephen Boston 21.04.2018 / 01:34

1 resposta

2

A resposta é que o bash procurará esses três arquivos (em situações ligeiramente diferentes), mas normalmente executará apenas um deles.

Ao executar um shell login (normalmente quando você faz login em um terminal, ou quando abre um Terminal GNOME ou similar, ou quando usa su - ), mais especificamente um shell de login interativo Em seguida, ele executará o /etc/profile em todo o sistema e, depois disso, ele procurará ~/.bash_profile , ~/.bash_login ou ~/.profile e executará o primeiro daqueles que encontrar.

Na página do bash man:

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.

Quando o bash é executado como um shell interativo, mais especificamente um shell interativo de não-login, ele lerá ~/.bashrc e executará esse arquivo.

Na página do bash man:

When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of ~/.bashrc.

O que as distribuições Linux normalmente fazem são enviar arquivos ~/.bash_profile , ~/.profile e ~/.bashrc que se interligam, para que você tenha um comportamento mais consistente sem precisar duplicar as configurações entre os arquivos ...

Por exemplo, o padrão ~/.profile do Debian contém este trecho:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Portanto, é explicitamente fazer o sourcing de ~/.bashrc , para que tanto os shells interativos de login como os não-login incluam as personalizações adicionadas ao arquivo.

    
por 21.04.2018 / 06:18

Tags