GNU Screen no heredará mi RUTA en 10.5.8

11

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 PATHelementos ( 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 .bashrcy no parece heredar mi PATHo cualquier otra variable de entorno correctamente de mi shell bash original. Debido a que solo se ejecuta .bashrcy 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 Bashdocumentos 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-06y 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 PATHen .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

Tim Visher
fuente
La duplicación se debe a que ha configurado bash para agregar incondicionalmente estas entradas, es un shell de 'inicio de sesión' y le está diciendo a la pantalla que invoque bash como un shell de 'inicio de sesión'. He reescrito mi respuesta para tratar de abordar los problemas generales de los shells, la pantalla y las variables de entorno.
Chris Johnsen

Respuestas:

16

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 de foo.

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 :

comando de shell

Establezca el comando que se utilizará para crear un nuevo shell. Esto anula el valor de la variable de entorno $ SHELL. Esto es útil si desea ejecutar un tty-enhancer que espera ejecutar el programa especificado en $ SHELL. Si el comando comienza con un carácter '-', el shell se iniciará como un shell de inicio de sesión.

Para tener shells de inicio de pantalla como shells de 'inicio de sesión', inicie la pantalla con screen -s -/bin/basho agregue esta línea a su .screenrc:

shell -/bin/bash

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 setenvy unsetenvcomandos 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 como strings "$(which screen)" | fgrep -i screenrcencontrar 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 usar SCREENRC=/dev/null SYSSCREENRC=/dev/null screenpara 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/shellconfiguració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/shellconfiguració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:

echo "$PATH"

Compruebe cómo el propio shell modifica el valor cuando se crea un sub-shell:

/bin/bash -c 'echo "$PATH"'

Verifique cómo el shell modifica el valor cuando se crea un sub-shell 'login':

perl -e '$s=shift;exec {$s} "-$s", @ARGV or die "unable to start shell"' /bin/bash
echo "$PATH"
exit

Compruebe cómo la pantalla modifica el valor:

printf '#!/bin/sh\nl=/tmp/echo-var.log;rm -f "$l"; echo $PATH >"$l"' >/tmp/echo-var &&
chmod a+x /tmp/echo-var &&
screen -s /tmp/echo-var &&
cat /tmp/echo-var.log
Chris Johnsen
fuente
Esto resuelve parte de mi problema. Lamentablemente, no funciona por completo. Ahora, la pantalla funciona bien, screen -s -/bin/bashpero no se comporta como esperaba que se comportara bajo Cygwin en mi máquina de trabajo. En esa máquina, ejecuto screen -h 50000y simplemente hereda mi PATHsin realmente obtener el archivo nuevamente. Esto se ejecuta cada vez que abro una nueva ventana.
Tim Visher
El entorno del proceso de pantalla siempre debe ser heredado por cualquiera de sus elementos secundarios (a excepción de cosas como TERM que podría anular). Intente FOOBAR=baz screeny verifique echo $FOOBARlas ventanas de shell desde screeny screen -s -/bin/bash. Ambas variaciones deberían tener FOOBAR= baz. Si PATHestá siendo modificado, entonces tendrá que rastrear lo que lo está haciendo. Intenta SYSSCREENRC=/dev/null SCREENRC=/dev/null screen, si eso te deja PATHpasar, entonces probablemente sea un setenv PATHin /etc/screenrco ~/.screenrc. De lo contrario, es algo que estás .bashrchaciendo.
Chris Johnsen
He hecho una gran reescritura de / adición a mi respuesta.
Chris Johnsen
2

La última vez que vi un problema similar, lo resolví usando screen -lal iniciar la pantalla.

Puede usar la -lopción al invocar screen(activar el modo de inicio de sesión ; también controlado por los comandos defloginy ) 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 -lmodo en la pantalla predeterminada de Debian Lenny (v4.0.3); parece estar activado por defecto. Mi ~/.profiley me ~/.bashrcestán leyendo correctamente. ¿Cómo estás invocando screen? Qué versión estás usando?

quijote curandero
fuente
Aunque bajo esta teoría, noscreen -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
quack quijote
Parece que -lsolo controla si screenagrega una entrada al utmparchivo, no si invoca shells nuevos con su propia -lopción o si usa la -costumbre exec- with- -fix.
Chris Johnsen
2

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

ChoqueEl Conejito
fuente
1

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
¿Te sentirías cómodo publicando tus archivos .bashrcy en .bash_profilealguna parte para que yo pueda verlos? El problema que tuve al hacer algo similar fue que PATHcrecía cada vez que creaba una nueva instancia de pantalla porque heredaría la anterior PATHy luego volvería a agregar todo nuevamente.
Tim Visher
Lo siento Tim, no vi esto ... He cambiado muchas cosas para que no tengan mucho sentido, pero esto es básicamente lo que hago. # .bash_profile if [-f ~ / .bashrc]; luego . ~ / .bashrc fi Luego pongo todo lo demás en .bashrc, excepto las cosas que quiero comenzar la primera vez que inicio sesión, que también entran en .bash_profile. PATH se maneja en .bashrc como una serie de líneas en lugar de una definición de ruta como la mayoría exporta PATH = / path / to / binaries1: $ PATH export PATH = / path / to / binaries2: $ PATH
0

Siempre que tengo un problema de esa manera se crea un archivo $HOME/.debugy 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ínea

test -f $HOME/.debug && echo $HOME/.bashrc 1>&2

o similar. Para la depuración específica, también puede agregar cosas como

test -f $HOME/.debug && echo PATH now equals $PATH 1>&2

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.

hlovdal
fuente
0

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.

ZaB
fuente