
Estou executando o RHEL6 (kernel 2.6.32-573.el6.x86_64). Eu tenho aliases que são originados ssh
em myserver
. Um deles é
alias scl-devtoolset-3='source /usr/local/bin/scls/devtoolset-3'
Presumivelmente, é um alias em shells que não são de login (veja abaixo), mas ssh
ing fornece um shell de login, e isso é confirmado pela linha
shopt -q login_shell && echo 'This is a login shell' || echo 'This is a non-login shell'
no meu ~/.bashrc
, que produz
This is a login shell
como esperado. Portanto, não tenho ideia de por que/onde o alias está definido.
Como racionalizar esta circunstância aparentemente contraditória?
Arquivos presentes em meu sistema:
/etc/profile
/etc/bashrc
/etc/profile.d/*
~/.bashrc
Arquivos não presentes em meu sistema:
/etc/bash.bashrc
~/.profile
DR
O alias parece estar definido (somente em shells que não são de login) pelas seguintes linhas em /etc/bashrc
:
...
if ! shopt -q login_shell ; then # We're not a login shell
...
# Only display echos from profile.d scripts if we are no login shell
# and interactive - otherwise just process them to set envvars
for i in /etc/profile.d/*.sh; do
if [ -r "$i" ]; then
if [ "$PS1" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
...
fi
qual arquivo de origem /etc/profile.d/scl-aliases.sh
contém
#!/bin/bash
sources_dir=/usr/local/bin/scls
for scl in `ls $sources_dir`; do
alias scl-$scl="source $sources_dir/$scl"
done
e dado que
$ ls /usr/local/bin/scls
devtoolset-3 devtoolset-4 devtoolset-6 python27 python33
Isso foi (parcialmente?) Confirmado executando bash -x
no prompt de comando após ssh
ing.
Responder1
Na verdade, esse é um comportamento normal. Tudo se resume aos diferentes arquivos provenientes de scripts de login e scripts sem login. Isto tem sidocoberto extensivamente em outro lugarmas, resumidamente, os shells bash (interativos) sem login originam a família bashrc de arquivos ( /etc/bash.bashrc
, ~/.bashrc
) e os shells de login (interativos) originam os vários arquivos de perfil ( /etc/profile
, ~/.profile
).
Então, o seu /etc/bashrc
(que eu acho equivalente ao /etc/bash.bashrc
macOS e talvez em outros sistemas) só é lido por shells interativos sem login edaemons shell remotos. Quando esse arquivo é lido, se o shell que o lê for um shell sem login (portanto, não um daemon de shell remoto), ele também trará arquivos específicos em /etc/profile.d
.
Os shells de login, entretanto, não leem este arquivo, portanto ele não é relevante aqui. Em vez disso, eles irão ler /etc/profile
e se você verificar esse arquivo, você encontrará algo assim (no /etc/profile
arquivo no meu Arch):
# Load profiles from /etc/profile.d
if test -d /etc/profile.d/; then
for profile in /etc/profile.d/*.sh; do
test -r "$profile" && . "$profile"
done
unset profile
fi
É por isso que você está vendo isso em um shell de login. É porque os shells de login não funcionam bashrc
e, em vez disso, têm seus próprios arquivos de configuração e eles trazem os arquivos abaixo, /etc/profile.d
mas sem excluir os shells de login.
Responder2
Estou postando isso como resposta, visto que os comentários não podem ter código recuado. Parabéns aa resposta de terdon.
Conforme afirmado por terdon, my /etc/profile
tem as seguintes linhas.
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
Estes seriam responsáveis pelo alias, não pelo /etc/bashrc
. Isto poderia ser facilmente verificado com uma solução paraSequência de rastreamento de scripts/comandos executados no ssh