0 votos

iTerm2 y Zsh - no se puede cambiar el prompt en .zshenv al inicio

Tengo 2 Macs, un viejo iMac en mi estudio y un MacMini en mi taller. Tengo iTerm2 en ambos. El MacMini es nuevo y todavía estoy afinando la configuración. Uso zsh para mi shell en ambos y el mismo .zshenv en ambos. He hecho todo lo posible para asegurarme de que estoy usando la misma configuración de iTerm2 en ambos. El problema es que puedo configurar el prompt en .zshenv en mi iMac, pero el mismo .zshenv script no hace nada con el prompt en mi nuevo MacMini. (Y he cambiado el shell a zsh y he comprobado que lo he hecho). NO estoy usando Oh-my-zsh. Acabo de descubrirlo y puede que lo añada más tarde, pero este problema me irrita mucho y quiero arreglarlo.

Aquí está el código correspondiente:

PROMPT='%F{magenta}%B[%b%D %* %n@%m %1~%B]%b $ %f'
uname=`whoami`
if [[ "$uname" == "root" ]]; then
    PROMPT='%F{red}%B[%b%D %* %n@%m %1~%B]%b $ %f'
fi
echo "Prompt = $PROMPT"
export LS_COLORS
echo "About to export prompt"
echo "Prompt = $PROMPT"
export PROMPT

Estoy recibiendo los siguientes comportamientos:

  • Cuando abro una nueva ventana o pestaña, me informa del valor adecuado para $PROMPT desde el script. No cambia mi prompt de %n@%m %1~ %# .
  • Cuando compruebo el valor (después de la ejecución de .zshenv), sale %n@%m %1~ %# .
  • Si copio y pego la línea del script que establece el prompt, cambia el prompt a lo que quiero.
  • Si escribo ./.zshenv se ejecuta y obtengo DOBLE salida de los comandos echo, como si se ejecutara el script dos veces y no cambia el prompt.
  • Si escribo source .zshenv se ejecuta, no se repite la salida, y el prompt cambia.
  • Si copio la línea que define el prompt del archivo y la pego en el terminal, cambia el prompt.
  • Cuando compruebo otros valores de variables y alias de .zshenv, se han importado al shell desde el script.

También acabo de comprobar en el programa normal de la terminal. No se me había ocurrido comprobarlo antes. También tengo los mismos comportamientos en el programa normal de terminal de Mac.

Este es el mismo script de mi antiguo Mac (que se ha mantenido al día con las actualizaciones regulares de Apple), pero se comporta de manera diferente en este Mac.

1voto

yoliho Puntos 340

El problema es que zsh también lee archivos de /etc además de los propios.

Apple proporciona ahora un /etc/zshrc que incluye

# Default prompt
PS1="%n@%m %1~ %# "

eliminando así sus cambios. (En Mojave - es decir, antes de zsh se hizo el defecto /etc/zshrc no contiene este )

El manual de zsh da el orden de los archivos de inicio.

Los comandos se leen primero de /etc/zshenv; esto no se puede anular. El comportamiento posterior es modificado por las opciones RCS y GLOBAL_RCS; la primera afecta a todos los archivos de inicio, mientras que la segunda sólo afecta a los archivos de inicio globales (los que se muestran aquí con una ruta que comienza con un /). Si una de las opciones no se establece en algún momento, no se leerá ningún archivo de inicio posterior del tipo correspondiente. También es posible que un archivo en $ZDOTDIR vuelva a activar GLOBAL_RCS. Tanto RCS como GLOBAL_RCS están activados por defecto.

Los comandos se leen de $ZDOTDIR/.zshenv. Si el shell es un shell de inicio de sesión, los comandos se leen de /etc/zprofile y luego de $ZDOTDIR/.zprofile. Luego, si el shell es interactivo, los comandos se leen de /etc/zshrc y luego de $ZDOTDIR/.zshrc. Finalmente, si el shell es un shell de inicio de sesión, se leen /etc/zlogin y $ZDOTDIR/.zlogin.

Los manuales dicen que los archivos zshenv son leídos por todas las invocaciones de zsh y zshrc es leído por los interactivos. Como ejecutar en la terminal y mostrar el prompt sólo se utiliza cuando se quiere escribir en la terminal entonces $PS1 sólo debe establecerse en los archivos zshrc y no en los archivos zshenv .

Es decir, mueve tu código de ~/.zshenv a ~/.zshrc

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X