Eu tenho alguns aliases que são definidos em /etc/zprofile
(ou /etc/profile
para bash). Também $PATH
é manipulado lá.
Eu quero iniciar um shell interativo de um shell que evita a manipulação $PATH
. Eu faço isso iniciando-o com a opção -f
. No entanto, os aliases que são definidos no shell pai são úteis e eu gostaria de encaminhá-los para o processo filho.
Copie e cole os aliases que são definidos por /etc/zprofile
uma vez em um arquivo de texto e fazer o sourcing toda vez que eu iniciar outro shell não é o que estou procurando, pois as definições em /etc/zprofile
são mantidas e podem mudar tempo.
Você tem uma recomendação sobre como encaminhar aliases para o segundo shell?
(Meu principal interesse são zsh
solutions, mas também estou curioso sobre bash
solutions)
É assim que a situação me parece
# log in with ssh
shell1 > echo "here aliases are the way I want them to be"
shell1 > VARIABLE1=value1 VARIABLE2=value2 PATH=some_paths zsh
shell2 > echo "/etc/zprofile prepended something to PATH, which I don't like"
shell2 > echo "aliases are good"
shell2 > exit
shell1 > VARIABLE1=value1 VARIABLE2=value2 PATH=some_paths zsh -f
shell2 > echo "/etc/zprofile did not prepend something to PATH. This is good!"
shell2 > echo "but all aliases from shell 1 are \"forgotten\""
shell2 > exit
Continuando a fornecer informações; as coisas em /etc
estão mais envolvidas do que eu pensava inicialmente:
/etc/zprofile
contém o seguinte, que tracei para ser o que define meus aliases e $PATH
_src_etc_profile()
{
# Make /etc/profile happier, and have possible ~/.zshenv options like
# NOMATCH ignored.
#
emulate -L ksh
# source profile
if [ -f /etc/profile ]; then
source /etc/profile
fi
}
_src_etc_profile
unset -f _src_etc_profile
mas perdi o /etc/zshrc
contém
_src_etc_profile_d()
{
# Make the *.sh things happier, and have possible ~/.zshenv options like
# NOMATCH ignored.
emulate -L ksh
# from bashrc, with zsh fixes
if [[ ! -o login ]]; then # We're not a login shell
for i in /etc/profile.d/*.sh; do
if [ -r "$i" ]; then
. $i
fi
done
unset i
fi
}
_src_etc_profile_d
unset -f _src_etc_profile_d
Portanto, não é apenas zprofile
que passa por /etc/profile.d
, mas também zshrc
. Um dos arquivos em /etc/profile.d
então (com comentários adicionados por mim sobre como isso acontece)
if [ -n "$SHLVL" ]; then
if [ $SHLVL = 1 ]; then
source /some/group/path/profile
# calls "source /some/group/path/env"
# -> see else branch
else
source /some/group/path/env
# calls "source /some/group/path/${SHELL}rc"
# which then calls
# "source /my/group/path/group_zshrc"
fi
else
echo 'No $SHLVL available, assuming login shell.'
source /some/group/path/profile
fi
e, finalmente, /my/group/path/group_zshrc
chama um programa python que grava um arquivo temporário no qual os aliaseses e as variáveis de ambiente são definidos / manipulados, que são então originados no final.