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
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/basho 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
setenvyunsetenvcomandos 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 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 usarSCREENRC=/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:
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/bashpero no se comporta como esperaba que se comportara bajo Cygwin en mi máquina de trabajo. En esa máquina, ejecutoscreen -h 50000y simplemente hereda miPATHsin realmente obtener el archivo nuevamente. Esto se ejecuta cada vez que abro una nueva ventana.FOOBAR=baz screeny verifiqueecho $FOOBARlas ventanas de shell desdescreenyscreen -s -/bin/bash. Ambas variaciones deberían tenerFOOBAR=baz. SiPATHestá siendo modificado, entonces tendrá que rastrear lo que lo está haciendo. IntentaSYSSCREENRC=/dev/null SCREENRC=/dev/null screen, si eso te dejaPATHpasar, entonces probablemente sea unsetenv PATHin/etc/screenrco~/.screenrc. De lo contrario, es algo que estás.bashrchaciendo.La última vez que vi un problema similar, lo resolví usando
screen -lal iniciar la pantalla.Puede usar la
-lopción al invocarscreen(activar el modo de inicio de sesión ; también controlado por los comandosdefloginy ) para establecer si la pantalla debe iniciar sesión en la ventana de forma predeterminada (agregar / eliminar la entrada / etc / utmp).login.screenrcEl 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 invocandoscreen? Qué versión estás usando?fuente
screen -lndeberí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-lsolo controla siscreenagrega una entrada alutmparchivo, no si invoca shells nuevos con su propia-lopció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
.bashrcy en.bash_profilealguna parte para que yo pueda verlos? El problema que tuve al hacer algo similar fue quePATHcrecía cada vez que creaba una nueva instancia de pantalla porque heredaría la anteriorPATHy luego volvería a agregar todo nuevamente.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í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