Compartilhar aliases e configuração de PATH entre zsh e bash

24

O shell que eu uso normalmente é zsh . Eu tenho vários aliases para ativar cores em alguns programas, como ls e grep . Também defini meu caminho personalizado para que eu possa executar programas em locais não padrão (como em ~/bin/ ).

Eu não altero o shell do root para zsh , mas gostaria de compartilhar essas configurações para essa raiz também pode tê-lo. Descobri que zsh não está obtendo /etc/profile . Eu posso fornecer isso em /etc/zsh/zprofile , mas eu gostaria de outro jeito mais "correto".

    
por phunehehe 23.10.2010 / 08:28

4 respostas

16

Eu criaria um arquivo /etc/commonprofile e o colocaria em /etc/profile e /etc/zsh/zprofile . Isso lhe dá a oportunidade de compartilhar configurações comuns e ainda usar bash , respectivamente, zsh configurações específicas e sintaxe em /etc/profile , respectivamente zprofile .

    
por 23.10.2010 / 20:24
15

O Zsh tem um modo de compatibilidade sh que permite executar código sh POSIX e algumas extensões bash. Contanto que você não use recursos bash que o zsh não possui (com a mesma sintaxe), você pode ter o mesmo arquivo de origem de ambos os shells. Use o emulate embutido para colocar o zsh no modo de compatibilidade; com a opção -L , a emulação é local para a função de inclusão (não o script de origem).

source_sh () {
  emulate -LR sh
  . "$@"
}

Para coisas como variáveis de ambiente, você pode usar source_sh /etc/profile em /etc/zprofile e source_sh ~/.profile em ~/.zprofile , pois os arquivos de perfil provavelmente não usarão recursos específicos do bash.

Para coisas como aliases e definições de funções, uma vez que os arquivos shell rc provavelmente contêm muitas coisas que não podem ser compartilhadas (prompt, atalhos de teclado, configurações de conclusão,…), use um arquivo como ~/.sh_aliases que é originado em ~/.bashrc e source_sh 'd em ~/.zshrc .

    
por 23.10.2010 / 23:11
4

Que tal um simples link simbólico?

ln -s /etc/profile /etc/zsh/zprofile

Você também pode acrescentar algo assim se precisar de uma inicialização condicional:

#Determine our shell without using $SHELL, which may lie
shell="sh"
if test -f /proc/mounts; then
   case $(/bin/ls -l /proc/$$/exe) in
        *bash) shell=bash ;;
        *dash) shell=dash ;;
        *ash)  shell=ash ;;
        *ksh)  shell=ksh ;;
        *zsh)  shell=zsh ;;
    esac
fi
    
por 23.10.2010 / 14:53
0

No que diz respeito às variáveis, tenho a impressão de que você está perdendo os módulos & modulefiles [1]. Quando você começar a fazer isso, será fácil criar perfis comuns para vários shells (incluindo bash & zsh), python, perl e até mesmo mais ambientes, tudo a partir da conveniência de um único arquivo de módulo.

Também é possível definir aliases da mesma maneira; no entanto, você descobrirá rapidamente que os aliases não são herdados muito bem entre os shells sucessivos e podem precisar de soluções alternativas.

[1] link

    
por 16.10.2014 / 02:45