Encaminhar aliases para o processo filho

4

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.

    
por pseyfert 23.05.2016 / 22:21

2 respostas

3

Você não deve definir aliases em /etc/zprofile ou ~/.zprofile . Esses arquivos são carregados apenas em shells de login (“shells” significando zsh, é claro). O local apropriado para definir os aliases é em /etc/zshrc ou ~/.zshrc , que é lido por todos os shells interativos.

Para executar o zsh sem carregar /etc/zprofile , basta executar zsh sem nenhuma opção. A opção -f diz ao zsh para não ler os arquivos de configuração, mas como você deseja ler suas definições de alias, essa não é a opção correta. Como /etc/zprofile é lido apenas por um shell de login, apenas não passe a opção -l (e não defina um argumento zeroth que comece com um traço).

O Zsh não possui opção ou variável de ambiente para ler um arquivo extra na inicialização. Se você quiser se preparar para isso, adicione eval $ZSH_EXTRA_STARTUP_CODE ao seu .zshrc .

Você pode definir a variável de ambiente ZDOTDIR para que ela leia todos os arquivos de configuração do usuário em um diretório diferente, por exemplo, ZDOTDIR=/tmp/foo zsh/etc/zshenv , /tmp/foo/.zshenv , /etc/zshrc e /tmp/foo/zshrc . Então, para exportar aliases da instância atual para uma instância filha, você pode executar algo como

tmp=$(mktemp -d)
alias -L >$tmp/.zshenv
echo ". ~/.zshenv; unset ZDOTDIR; rm -r ${(q)tmp}" >>$tmp/.zshenv
zsh
    
por 24.05.2016 / 02:14
2

Em bash

Você pode abusar da opção --rcfile da seguinte forma:

bash --noprofile --rcfile <(alias)

Mas o --noprofile é bastante inútil sem a opção -l para torná-lo um login shell.

    
por 23.05.2016 / 22:42

Tags