Compartir alias y configuración de RUTA entre zsh y bash


24

El shell que normalmente uso es zsh. Tengo varios alias para habilitar el color en algunos programas como lsy grep. También configuré mi ruta personalizada para poder ejecutar programas en un lugar no estándar (como en ~/bin/).

No cambiaré el shell de root a zsh, pero me gustaría compartir esta configuración para que root pueda tenerla también. Descubro que zshno se trata de abastecimiento /etc/profile. Puedo obtenerlo /etc/zsh/zprofile, pero me gustaría alguna otra forma más "adecuada".

Respuestas:


16

Crearía un archivo /etc/commonprofiley lo buscaría en ambos /etc/profiley /etc/zsh/zprofile. Esto le da la oportunidad de compartir la configuración común y seguir utilizando bash, respectivamente, zshlos ajustes y la sintaxis específicas en /etc/profile, respectivamente zprofile.


entre otras buenas respuestas, creo que esta me conviene la mejor, relativamente simple y "limpia"
phunehehe

¿Qué quieres decir con "fuente"?
Hlung

@Hlung Para cargar la explicilidad del perfil de shell, aquí viene el 'source /path/to/.shell_profile'. Consulte la página del manual sobre 'fuente'.
Itachi

17

Zsh tiene un modo de compatibilidad sh que le permitirá ejecutar código POSIX sh y algunas extensiones bash. Siempre que no use las funciones de bash que no tiene zsh (con la misma sintaxis), puede tener el mismo archivo originado por ambos shells. Use el emulateincorporado para poner zsh en modo de compatibilidad; con la -Lopción, la emulación es local para la función de cierre (no el script de fuente de cierre).

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

Para cosas como las variables de entorno, puede usar source_sh /etc/profilein /etc/zprofiley source_sh ~/.profilein ~/.zprofile, ya que no es probable que los archivos de perfil usen características específicas de bash.

Para cosas como alias y definiciones de funciones, dado que es probable que los archivos shell rc contengan muchas cosas que no se pueden compartir (solicitud, enlaces de teclas, configuraciones de finalización, ...), use un archivo como ~/.sh_aliasesese que se obtiene ~/.bashrcy source_sh'd en ~/.zshrc.


2
Debería haber una manera de decir "vota automáticamente automáticamente todas las respuestas de Gilles". Esto me ahorraría bastante tiempo. No realmente, tus respuestas son increíbles Siempre preciso, bien escrito y completo.
fschmitt

@fschmitt: estoy de acuerdo. ¡Y puedes ver que ni siquiera está editado! Esta pista proporcionada aquí es realmente buena.
Alguien todavía te usa MS-DOS el

4

¿Qué pasa con un enlace simbólico simple?

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

También puede agregar algo como esto si necesita una inicialización 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

Hmm, pero no creo que esto sea más limpio que obtenerlo. ¿Hay un archivo que leerán zsh y bash?
phunehehe

¿Qué te hace pensar que buscar o crear un enlace simbólico no es una solución "limpia"?
echox

Solo quería decir si fuera necesario, me gustaría obtener el archivo en lugar de administrar el enlace simbólico. No quiero crear mucha dependencia entre archivos.
phunehehe

1
Una alternativa más portátil a /bin/ls -l /proc/$$/exees ps -o comm= -p $$. Esto no es totalmente confiable porque algunos shells se comportan de manera diferente dependiendo de cómo se invocaron; en la práctica, simplemente prueba $0de .profileque es probable que sea una mejor indicación. Pero la mayoría de los depósitos que ofrecen funciones útiles (bash, ksh, zsh) pueden ser simplemente reconocidos (y su versión identificada, la cual es una gran ventaja) mediante pruebas de algunas variables: $BASH, $BASH_VERSION, $BASH_VERSINFO; $KSH_VERSION, ${.sh.version}; $ZSH_VERSION.
Gilles 'SO- deja de ser malvado'

echox, su declaración de caso no detecta correctamente zsh4 #Determine nuestro shell sin usar $ SHELL, que puede ser shell = "sh" si test -f / proc / mounts; luego mayúscula $ (/ bin / ls -l / proc / $$ / exe) en bash) shell = bash ;; * guión) shell = guión ;; * ceniza) concha = ceniza; * ksh) shell = ksh ;; * zsh ) shell = zsh ;; #matches zsh4 esac fi
Bryan Hunt

0

En cuanto a las variables, tengo la impresión de que faltan módulos y archivos de módulo [1]. Una vez que comience a hacerlo, será fácil crear perfiles comunes para varios shells (incluidos bash y zsh), python, perl e incluso más entornos, todo desde la comodidad de un solo archivo de módulo.

También es posible definir alias de la misma manera; sin embargo, encontrará rápidamente que los alias no se heredan muy bien entre los shells sucesivos y pueden necesitar soluciones alternativas.

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.