ti-enxame.com

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

O Shell que eu normalmente uso é zsh. Tenho vários apelidos para ativar a cor em alguns programas, como ls e grep. Também defini meu caminho personalizado para poder executar programas em locais não padrão (como em ~/bin/).

Eu não mudarei o shell do root para zsh, mas eu gostaria de compartilhar essas configurações para que o root também possa ter. Descobri que zsh não está fornecendo /etc/profile. Posso obtê-lo em /etc/zsh/zprofile, mas gostaria de alguma outra forma mais "adequada".

24
phunehehe

Eu criaria um arquivo /etc/commonprofile e fonte 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.

17
fschmitt

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 do bash que o zsh não tem (com a mesma sintaxe), você pode ter o mesmo arquivo originado por ambos os shells. Use o emulate embutido para colocar o zsh no modo de compatibilidade; com o -L opção, a emulação é local para a função envolvente (não para o script de origem envolvente).

source_sh () {
  emulate -LR sh
  . "[email protected]"
}

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

Para coisas como aliases e definições de funções, uma vez que os arquivos rc do Shell 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 originado em ~/.bashrc e source_sh 'd em ~/.zshrc.

18

Que tal um link simbólico simples?

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

Você também pode acrescentar algo assim se precisar de alguma 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
4
echox

No que diz respeito às variáveis, tenho a impressão de que faltam módulos e arquivos de módulo [1]. Depois de começar a fazer isso, será fácil criar perfis comuns para vários shells (incluindo bash e zsh), python, Perl e até mais ambientes, tudo com a conveniência de um único arquivo de módulo.

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

[1] http://en.wikipedia.org/wiki/Environment_Modules_ (software)

0
fgeorgatos