Por que o .bashrc não é lido ao trocar de usuário?

1

No RHEL7, vejo um comportamento diferente com scripts de inicialização quando eu su para um usuário com /bin/sh ou /bin/bash como o shell, apesar do fato de /bin/sh apontar para /bin/bash

Eu tenho os seguintes scripts configurados para o usuário:

/home/my_user/.profile

echo Hello from .profile

/home/my_user/.bash_profile

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

echo Hello from .bash_profile

/home/my_user/.bashrc

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
echo Hello from .bashrc

Agora, quando eu su e especifique /bin/bash , recebo a seguinte saída.

[batwad@hellodave ~]$ sudo su -s /bin/bash my_user
Hello from .bashrc
[my_user@hellodave batwad]$

Isso significa que .bash_profile não foi executado? Afinal, não vejo "Olá de .bash_profile"

Agora, quando eu su e especifique /bin/sh (que vincula a /bin/bash de qualquer maneira), recebo a seguinte saída.

[batwad@hellodave ~]$ sudo su -s /bin/sh my_user
sh-4.2$

Nenhum eco e um prompt de shell diferente. O que dá?

Atualizar

Seguindo a resposta de redseven, tentei adicionar -l e consegui outro comportamento!

[bawtad@hellodave ~]$ sudo su -l -s /bin/sh my_user
Last login: Thu Aug 16 11:44:38 UTC 2018 on pts/0
Hello from .profile
-sh-4.2$

É .profile que é usado desta vez! Observe que a parte "Último login" não foi exibida na primeira tentativa.

    
por batwad 16.08.2018 / 12:25

3 respostas

1

A diferença de comportamento que você vê é um recurso padrão de bash para garantir uma compatibilidade total para ambientes padrão de shell Bourne.

Na boca da página padrão bash man (tipo /INVOCATION ):

If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well.

    
por 18.08.2018 / 13:56
1

Se você quiser usar todas as suas configurações quando normalmente tem um login, a melhor maneira de usar a opção -l (ou simples - ) para su:

man su:

       -, -l, --login
       Provide an environment similar to what the user would expect had the user logged in
       directly.

Com a opção -l seu ~. / bash_profile será usado (e seu .bashrc também se estiver incluído no seu .bash_profile), caso contrário seu shell não é um shell de login e somente o ~ / .bashrc será usado.

Isso só é verdade se o seu shell for bash. Se você tiver um shell padrão diferente ou especificar um shell diferente com a opção -s, tudo depende de como esse shell funciona (o que pode usar ou ignorar as configurações do bash). Mesmo que / bin / sh seja um link simbólico para o binário bash, ele é um shell diferente, o binário detecta o caminho que você iniciou e inicia um shell diferente, não o bash.

    
por 16.08.2018 / 13:08
0

Se o bash iniciar como um shell interativo de não-login, procure por ~/.bash_bashrc , ~/.bashrc para configuração específica do usuário e /etc/bash.bashrc para configuração ampla do sistema (consulte a man page bash).

mas se for executado como um shell de login interativo (o que pode ser feito anexando --login ), ele primeiro procura ~/.profile ou ~/bash_profile (o que estiver disponível ... no seu caso, ele atinge ~/.profile por isso não se incomodará em ler o ~/bash_profile ) para configuração específica do usuário e /etc/profile para configurações do sistema

se você quiser fonte ambos os arquivos adicionar isso ao seu arquivo .bashrc

 if [ -f $HOME/.profile ]; then
     . /etc/profile
 fi
    
por 16.08.2018 / 16:48

Tags