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

24

O shell que eu normalmente uso é zsh. Eu tenho vários aliases para ativar a cor em alguns programas como lse grep. Também configurei meu caminho personalizado para executar programas em locais não padrão (como em ~/bin/).

Eu não vai mudar shell de raiz para zsh, mas eu gostaria de compartilhar essas configurações para que o root pode tê-lo também. Eu descobri que zshnão é fonte /etc/profile. Eu posso obtê-lo /etc/zsh/zprofile, mas gostaria de outra maneira mais "adequada".

phunehehe
fonte

Respostas:

16

Eu criaria um arquivo /etc/commonprofilee o originaria em ambos /etc/profilee /etc/zsh/zprofile. Isso lhe dá a oportunidade de compartilhar configurações comuns e ainda usar bashrespectivamente zshconfigurações e sintaxe específicas em /etc/profilerespectivamente zprofile.

fschmitt
fonte
entre outras boas respostas acho que este ternos mim o melhor, relativamente simples e "limpo"
phunehehe
o que você quer dizer com "fonte"?
Hlung 14/05
@Hlung Para carregar a explicabilidade do perfil do shell, aqui vem o 'source /path/to/.shell_profile'. Veja a página de manual na 'fonte'.
Itachi
17

O Zsh possui um modo de compatibilidade sh que permitirá executar o código sh POSIX e algumas extensões bash. Desde que você não use os recursos do bash que o zsh não possui (com a mesma sintaxe), você pode ter o mesmo arquivo originado pelos dois shells. Use o emulatebuilt-in para colocar o zsh no modo de compatibilidade; com a -Lopção, a emulação é local para a função anexa (não o script de origem anexado).

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

Para coisas como variáveis ​​de ambiente, é possível usar source_sh /etc/profilein /etc/zprofilee source_sh ~/.profilein ~/.zprofile, pois os arquivos de perfil provavelmente não usam recursos específicos do bash.

Para coisas como aliases e definições de funções, como os arquivos shell rc provavelmente contêm muitas coisas que não podem ser compartilhadas (prompt, combinações de teclas, configurações de conclusão, ...), use um arquivo como o ~/.sh_aliasesque é fornecido ~/.bashrce source_sh'd no ~/.zshrc.

Gilles 'SO- parar de ser mau'
fonte
2
Deve haver uma maneira de dizer "automaticamente votar todas as respostas por Gilles". Isso me pouparia algum tempo. Não, realmente, suas respostas são demais. Sempre preciso, bem escrito e abrangente.
Fschmitt 23/10/10
@ fschmitt: eu concordo. E você pode ver que nem é editado! Essa dica fornecida aqui é muito boa.
Alguém ainda usa o MS-DOS
4

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
echox
fonte
Hmm, mas eu não acho que isso será mais limpo do que comprar. Existe um arquivo que o zsh e o bash irão ler?
phunehehe
o que faz você pensar que buscar ou criar um link simbólico não é uma solução "limpa"?
Echox 23/10/10
Eu só queria dizer que, se necessário, gostaria de obter o arquivo em vez de gerenciar o link simbólico. Não quero criar muita dependência entre arquivos.
phunehehe
11
Uma alternativa mais portátil para o /bin/ls -l /proc/$$/exeé ps -o comm= -p $$. Isso não é totalmente confiável, porque algumas conchas se comportam de maneira diferente, dependendo de como foram invocadas; na prática, simplesmente testando $0em .profileé provável que seja uma indicação melhor. Mas a maioria das conchas que oferecem recursos úteis (bash, ksh, zsh) podem ser simplesmente reconhecidos (e sua versão identificado, que é um grande plus), testando algumas variáveis: $BASH, $BASH_VERSION, $BASH_VERSINFO; $KSH_VERSION, ${.sh.version}; $ZSH_VERSION.
Gilles 'SO- stop be evil'
echox, sua instrução de caso não detecta corretamente o zsh4 #Determine nosso shell sem usar $ SHELL, que pode estar no shell = "sh" se test -f / proc / mounts; então case $ (/ bin / ls -l / proc / $$ / exe) no bash) shell = bash ;; * traço) shell = traço ;; * cinza) concha = cinza ;; * ksh) shell = ksh ;; * zsh ) shell = zsh ;; #matches zsh4 esac fi
Bryan Hunt
0

No que diz respeito às variáveis, tenho a impressão de que estão faltando módulos e modulefiles [1]. Quando você começar a fazer isso, será fácil criar perfis comuns para vários shells (incluindo bash e zsh), python, perl e ainda mais ambientes, tudo isso com a 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 shells sucessivos e podem precisar de soluções alternativas.

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

fgeorgatos
fonte