Acabo de pasar mucho tiempo leyendo sobre el inicio de sesión y los shells interactivos y por qué uno debería o no configurar el entorno variables, funciones de shell, etc. en los diversos archivos de perfil y bashrc. En esta publicación se mencionó que las cosas específicas de bash, como las opciones de solicitud, deben configurarse en ~ / .bashrc. Eso me llevó a preguntarme sobre la variable PS1. En todos los ejemplos que he visto con respecto a esto, tienen algo como export PS1=""
. ¿Debería realmente exportarse al entorno ya que solo tiene significado para bash? Solo tener PS1=""
en mi ~ / .bashrc produce el efecto deseado para mí, pero me pregunto si me estoy perdiendo algo.
Respuesta
Eso es correcto: PS1
solo es significativo en instancias interactivas de bash, por lo que debe establecerse en ~/.bashrc
y no debe exportarse. PS1
también es significativo en otros shells, pero tiene un significado diferente, porque las expansiones de avisos difieren entre shells. De hecho, incluso entre instancias de bash, PS1
puede tener diferentes significados, ya que el significado depende de las opciones del shell (al menos promptvars
).
Exportar PS1
al entorno desde .profile
es un retroceso a la década de 1970, cuando solo había un shell que lo usó (el shell Bourne) y no tenía un archivo de configuración. Todavía funciona hoy si siempre usa el mismo shell y nunca lo configura de manera diferente. Pero todos los shells modernos que no están diseñados exclusivamente para secuencias de comandos (csh, ksh , bash, zsh,…) lee un archivo de configuración cuando se inicia de forma interactiva (.cshrc
, .kshrc
, .bashrc
, .zshrc
,…), por lo que el método de la década de 1970 ya no es necesario. Establecer PS1
y otras configuraciones específicas de shell en un archivo específico de shell, y no exportarlo al entorno, evita romper cosas cuando usa una configuración de shell diferente o un shell diferente o un terminal diferente que no es capaz de mostrar su fantasía habitual. La configuración de PS1
en un archivo específico de shell funciona todo el tiempo, mientras que la configuración en .profile
y exportarlo solo funciona en casos “simples”, por lo que no hay razón para no hacerlo de la manera correcta, pero hay muchos tutoriales malos en la web e incluso malas configuraciones predeterminadas en las distribuciones. C «est la vie .
Comentarios
- ¿Cómo exportar
PS1
de.profile
funcionan para shells de bash sin inicio de sesión, ya que no ' t la fuente? ¿Estás diciendo que esto funcionaría porque no el shell de inicio de sesión se bifurcaría desde un shell de inicio de sesión, por lo que ¿heredaríaPS1
a través del entorno? - @MikeSweeney sí, eso ' s por qué ' s exportado .
- Una forma en que se difunde la idea equivocada sobre la exportación de PS1 es viendo
if [ -n "$PS1" ] ; then proceed assuming an INTERACTIVE shell ; fi
– que suele aparecer en los archivos ' s .bashrc de las personas para cargar solo cosas como la finalización de comandos si se trata de un usuario ' s shell de terminal interactivo. Por lo tanto, al ver que funciona allí, la misma lógica termina en los scripts de shell, por lo que " necesita " para exportarlo. EN SU LUGAR, deberíamos buscar en usuarios teractivos / terminales contty -s
otest -t 0
. - @DouglasDD De hecho. La prueba
PS1
se ha realizado en Debian ' s/etc/profile
durante años, por ejemplo. No ' no sé dónde surgió esta mala práctica. Sospecho que provino de un caso de uso en particular (¿tal vez detectando inicios de sesión rlogin o ssh?) Donde sucedió que funciona. Desafortunadamente, falla en muchos otros casos, de ahí las muchas preguntas sobre este tema aquí y en otros lugares. - @Gilles no deberíamos exportar
CLICOLOR
yLS_COLORS
¿tampoco? @DouglasDD, ¿eso significa que elif [[-z $p1]];then return fi
comprobar en mi.bashrc
es defectuoso?