Uso la pantalla a diario para mis necesidades de terminal y estoy bastante contento con ella. Recientemente, sin embargo, he hecho algunos cambios a los archivos de configuración de bash y me di cuenta de que yo estaba sentado varios PATH
elementos ( PATH
, MANPATH
, INFOPATH
, etc.) en 2 lugares. Modifiqué los archivos para que sean lo que deberían ser y ahora todas mis variables de entorno se configuran una vez .bash_profile
. Aquí yace mi problema.
Aparentemente, la razón por la que los puse en dos lugares fue por la pantalla. parece que la pantalla solo se ejecuta .bashrc
y no parece heredar mi PATH
o cualquier otra variable de entorno correctamente de mi shell bash original. Debido a que solo se ejecuta .bashrc
y ahora solo configuro mis variables .bash_profile
, obtengo un incompleto PATH
.
Mi pregunta, entonces, es cómo llevar mis variables de entorno a la pantalla sin la duplicación. Leer los Bash
documentos parece indicar que podría ser el tipo de shell que utiliza la pantalla para iniciar sesión, es decir, un shell interactivo sin inicio de sesión, pero no pude descubrir cómo forzar a la pantalla a usar un tipo particular de shell, solo el shell para usar a través de -s /bin/bash
.
Puedes leer mis archivos de configuración en mi página de GitHub . Este es el commit commit que rompió la pantalla .
EDITAR: estoy usando Screen version 4.00.03 (FAU) 23-Oct-06
y tiendo a invocarlo porscreen -h 50000
EDITAR: ahora he podido probar esto en Cygwin ( CYGWIN_NT-5.1 1.7.1(0.218/5/3) i686
, Screen version 4.00.03 (FAU) 23-Oct-06
) y muestra un comportamiento diferente que en mi Mac.
El comportamiento específico que he descubierto ahora es que en Cygwin los cambios que hago PATH
en .bash_profile se duplican al ingresar a la pantalla y luego la creación sucesiva de ventanas de pantalla no duplican la ruta, sino que vuelven a fuente .bash_profile.
Para ilustrar el comportamiento del que estoy hablando:
Salida desde una nueva terminal:
...
PATH: /home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/ATI Technologies/ATI.ACE/Core-Static:/groovy-1.6.1/bin:/usr/lib/lapack
MANPATH: /home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man
Aliases:
alias ..='cd ..'
alias ...='cd ../..'
...
[~]$
Salida de la primera invocación de pantalla:
[~]$ screen -h 50000 -s -/bin/bash
...
PATH: /home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/ATI Technologies/ATI.ACE/Core-Static:/groovy-1.6.1/bin:/usr/lib/lapack
MANPATH: /home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man:/home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man:/usr/ssl/man
Aliases:
alias ..='cd ..'
alias ...='cd ../..'
...
[~]$
Llamadas posteriores a C-a c
:
...
PATH: /home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/ATI Technologies/ATI.ACE/Core-Static:/groovy-1.6.1/bin:/usr/lib/lapack
MANPATH: /home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man:/home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man:/usr/ssl/man
Aliases:
alias ..='cd ..'
alias ...='cd ../..'
...
[~]$
Puedes ver
fuente
Respuestas:
pantalla y variables de entorno
Por defecto, la pantalla pasa a sus shells (y otros procesos) cualesquiera que sean las variables de entorno que tenía cuando se inició la sesión (es decir, la reconexión no cambia qué variables de entorno se dan a los nuevos shells). Pero debido a que los archivos de configuración de pantalla y shells cambian comúnmente las variables de entorno, hay muchos lugares donde se pueden introducir cambios inesperados. Hay algunas variables, como TERM , que la pantalla casi siempre cambia, pero generalmente son necesarias para la funcionalidad que proporciona la pantalla .
Digamos que ni la configuración de su shell ni la configuración de la pantalla modificarán una variable llamada FOOBAR (muy probablemente, en general). Si comienza una sesión con
FOOBAR=foo screen
, todos los shells creados en esa sesión tendrán una variable de entorno denominada FOOBAR con un valor defoo
.Las cosas se vuelven más complicadas para las variables que la pantalla o su shell podrían modificar.
Falta la configuración al usar la pantalla
Conchas de inicio de sesión
Si encuentra que faltan algunas configuraciones en los shells iniciados por la pantalla , puede ser porque su shell está configurado solo para actualizar esos ajustes para los shells de 'inicio de sesión'. La mayoría de los shells comprenden una convención especial (en C:)
**argv == '-'
que la pantalla se puede configurar para usar.Por la documentación de la pantalla :
Para tener shells de inicio de pantalla como shells de 'inicio de sesión', inicie la pantalla con
screen -s -/bin/bash
o agregue esta línea a su.screenrc
:Ajuste la ruta a cualquier shell que esté utilizando.
Configuración de pantalla
Faltan o variables de entorno de restablecimiento también podrían deberse a
setenv
yunsetenv
comandos en una pantalla de archivo de configuración. Tendrá que verificar tanto el .screenrc en su directorio de inicio como el archivo que esté utilizando su compilación de pantalla como 'system screenrc' (puede intentar un comando comostrings "$(which screen)" | fgrep -i screenrc
encontrar el nombre de ruta que se configuró en el momento de la compilación, generalmente es / etc / screenrc para una pantalla instalada en el sistema ; las instalaciones de complementos probablemente usarán algún otro nombre de ruta). Puede usarSCREENRC=/dev/null SYSSCREENRC=/dev/null screen
para evitar temporalmente estos archivos de configuración, pero hay una opción de tiempo de compilación que impide el uso efectivo de SYSSCREENRC (presumiblemente para que los administradores del sistema puedan forzar un poco de configuración inicial).Configuración duplicada al usar la pantalla
Es bastante común agregar elementos a una variable de entorno como PATH en los archivos de configuración de un shell para que el valor actualizado esté disponible para las sesiones normales del shell (por ejemplo, xterm u otras ventanas de terminal, sesiones de consola, etc.). Si dichos elementos se agregan en la configuración de un shell por shell (o, si está utilizando la
-/path/to/shell
configuración descrita anteriormente, en la configuración de shells por inicio de sesión), el shell iniciado por pantalla probablemente tendrá varias copias de los elementos agregados.Una estrategia para evitar esto es poner todas las adiciones a variables como PATH en la configuración por inicio de sesión de su shell y evitar usar la
-/path/to/shell
configuración del shell con la pantalla .Otra estrategia es agregar solo condicionalmente los nuevos elementos a la variable. Dependiendo del shell, el código para hacer esto puede ser un poco complicado, pero generalmente se puede encapsular en una función de shell para facilitar su uso.
Otra estrategia es comenzar siempre con un valor fijo en sus archivos de configuración. Esto a veces puede causar problemas al mover sus archivos de configuración de un sistema a otro cuando los valores predeterminados pueden variar significativamente.
Diagnósticos
Si no puede detectar directamente dónde está ocurriendo una modificación en particular, puede intentar lo siguiente para localizar dónde está ocurriendo el cambio.
Verifique el valor actual en su shell inicial:
Compruebe cómo el propio shell modifica el valor cuando se crea un sub-shell:
Verifique cómo el shell modifica el valor cuando se crea un sub-shell 'login':
Compruebe cómo la pantalla modifica el valor:
fuente
screen -s -/bin/bash
pero no se comporta como esperaba que se comportara bajo Cygwin en mi máquina de trabajo. En esa máquina, ejecutoscreen -h 50000
y simplemente hereda miPATH
sin realmente obtener el archivo nuevamente. Esto se ejecuta cada vez que abro una nueva ventana.FOOBAR=baz screen
y verifiqueecho $FOOBAR
las ventanas de shell desdescreen
yscreen -s -/bin/bash
. Ambas variaciones deberían tenerFOOBAR
=baz
. SiPATH
está siendo modificado, entonces tendrá que rastrear lo que lo está haciendo. IntentaSYSSCREENRC=/dev/null SCREENRC=/dev/null screen
, si eso te dejaPATH
pasar, entonces probablemente sea unsetenv PATH
in/etc/screenrc
o~/.screenrc
. De lo contrario, es algo que estás.bashrc
haciendo.La última vez que vi un problema similar, lo resolví usando
screen -l
al iniciar la pantalla.Puede usar la
-l
opción al invocarscreen
(activar el modo de inicio de sesión ; también controlado por los comandosdeflogin
y ) para establecer si la pantalla debe iniciar sesión en la ventana de forma predeterminada (agregar / eliminar la entrada / etc / utmp).login
.screenrc
El modo de inicio de sesión está activado de forma predeterminada, pero eso se puede cambiar en tiempo de compilación. Si la pantalla no está compilada con soporte total, estos comandos no están disponibles.
Parece que no necesito el
-l
modo en la pantalla predeterminada de Debian Lenny (v4.0.3); parece estar activado por defecto. Mi~/.profile
y me~/.bashrc
están leyendo correctamente. ¿Cómo estás invocandoscreen
? Qué versión estás usando?fuente
screen -ln
debería ejecutar mi , y todavía se ejecuta. prueba la bandera, pero esta probablemente no sea la respuesta correcta. Lo dejaré aquí por el momento.~/.profile
-l
-l
solo controla siscreen
agrega una entrada alutmp
archivo, no si invoca shells nuevos con su propia-l
opción o si usa la-
costumbre exec- with- -fix.El problema radica en el comportamiento de launchd en Leopard. Vea este informe de errores de MacPorts para la pantalla en Leopard para ver por qué nunca se solucionará a menos que de alguna manera pueda hacer una copia de seguridad del lanzamiento de Snow Leopard.
https://trac.macports.org/ticket/18235#comment:26
fuente
No hay nada de malo en obtener su .bashrc desde dentro de .bash_profile. Si solo está utilizando su máquina localmente, su .bash_profile en la mayoría de los casos solo se obtendrá cuando realice su inicio de sesión inicial (obviamente, hay otras veces que se obtiene).
Organizo mis archivos de modo que si quiero que se haga algo solo cuando inicio sesión, pongo la información en .bash_profile y para todo lo demás los pongo en .bashrc. PATH es una cosa que pongo en mi .bashrc, y obtengo .bashrc en mi .bash_profile.
fuente
.bashrc
y en.bash_profile
alguna parte para que yo pueda verlos? El problema que tuve al hacer algo similar fue quePATH
crecía cada vez que creaba una nueva instancia de pantalla porque heredaría la anteriorPATH
y luego volvería a agregar todo nuevamente.Siempre que tengo un problema de esa manera se crea un archivo
$HOME/.debug
y en todos los archivos de origen / ejecutado durante la invocación de inicio de sesión / shell (por ejemplo~/.bashrc
,~/.bash_profile
,~/.profile
,/etc/bashrc
, etc) tengo como la primera líneao similar. Para la depuración específica, también puede agregar cosas como
De esta forma, puede estar 100% absolutamente seguro de qué archivos se usan o no.
La redirección a stderr es importante, no desea que algo estropee stdout en muchas situaciones.
fuente
Puede quedarse con .profile ya que el sistema no toca bashrc (como la sesión de gráficos) Ahora simplemente tiene dos conjuntos diferentes de entorno: uno de .profile, otro para bash de .bashrc.
fuente