¿Cómo le pido a la pantalla que se comporte como un bash shell estándar?

37

Acabo de enterarme del comando de pantalla en Linux: es genial. Me encanta. Sin embargo, el terminal / indicador real en la pantalla se ve y se comporta de manera diferente a mi indicador bash estándar. Es decir, los colores no son los mismos, la finalización de la pestaña no parece funcionar, etc.

¿Hay alguna manera de decirle a la pantalla que se comporte como un aviso bash normal (al menos, normal como en lo que estoy acostumbrado)?

Información Adicional

Me estoy conectando a través de ssh desde una Mac (Terminal) a una caja de linux sin cabeza (Ubuntu). Después de iniciar sesión, tengo TERM=xterm-colory cuando ejecuto la pantalla tengo TERM=screen.

Voy a probar las sugerencias a continuación para ver si puedo cambiar el $TERMvalor primero.

Thornomad
fuente
Solo por curiosidad, ¿qué sistema operativo y qué tipo de terminal tienes cuando inicias la pantalla? Supongo que sus problemas tienen más que ver con su Terminal haciendo algo mal o identificándose incorrectamente en la pantalla.
Zoredache
@Zoredache: agregué esa información a la publicación anterior. Gracias. Tuve que ajustar la configuración de mi Terminal para permitir que la tecla de retroceso funcione ...
thornomad
Yuck, realmente no me gusta Terminal.app. Personalmente, le sugiero que considere usar una alternativa ver ( serverfault.com/questions/19240/… )
Zoredache

Respuestas:

39

Gracias a esta publicación , lo que hice fue agregar una línea a ~/.screenrc:

# ~/.screenrc
defshell -bash      # dash makes it a login shell

Entonces las cosas en su ~/.bashrc, /etc/bashrc, etc. deben hacerse funcionar.

Seamus Abshere
fuente
13

la pantalla cambia el tipo de término a screen. Puedes hacer una de las dos cosas:

  1. cambiar la configuración del término en su .screenrc
  2. modificar sus .bashrcarchivos de buscar TERM=screen, así comoTERM=xterm
staticsan
fuente
44
¡Gracias! Creé un $HOME/.screenrcarchivo y agregué esta línea en la parte superior: term xterm-colory ¡vaya! Indicador de color y los $TERMvalores coinciden. Sin embargo, no para rellenar la ficha ...
thornomad
Debe profundizar en lo que activa la finalización de tabulación. Los scripts de configuración de shell predeterminados no son completamente consistentes sobre lo que habilitan en función de $TERM; algunas cosas permitirán con xterm y xterm-color, otras solo buscarán xterm. Otras cosas tienen otros interruptores.
staticsan
11

Me gusta la forma en que escribiste tu pregunta, me preguntaba lo mismo y me tomó un tiempo resolverlo. Tuve la suerte de saber un poco sobre la invocación de shell, así que pensé que el problema yacía en alguna parte.

Aquí están mis hallazgos. En primer lugar, personalmente me parece interesante y vale la pena saber la diferencia entre un shell de inicio de sesión y un shell sin inicio de sesión. Haz una man $SHELLbúsqueda de la sección INVOCACIÓN para leer más sobre ella.

Puede preguntarle a su instancia de shell actual si es un shell de inicio de sesión o un shell que no es de inicio de sesión emitiendo un shopt login_shellmensaje en su solicitud. Tenga en cuenta que esto normalmente es una opción de solo lectura.

En mis sistemas Debian, screensiempre viene predeterminado con shells sin inicio de sesión.

Después de buscar en la web y leer man $SHELL, probé algunas cosas y los siguientes dos enfoques funcionaron para mí. En ~/.screenrcagregar / actualizar una línea de la siguiente manera:

shell -$SHELL

Si eso no funciona Y lo estás usando bash, puedes probar alternativamente, como lo comparte Seamus :

defshell -bash

Como se mencionó, puede probar si su instancia de shell actual es un shell de inicio de sesión emitiendo shopt login_shellen su solicitud.

Kyle
fuente
¿Es la forma de iniciar el shell en el directorio actual? Un ejemplo de lo que deseo es el siguiente cd ~/Projects ; screen ; pwd #=> ~/Projects. Sin embargo, lo que obtengo después de agregar shell -$SHELLa mi ~/.screenrcescd ~/Projects ; screen ; pwd #=> ~/
rudolph9
9

Dependiendo de cómo esté acostumbrado a ejecutar Bash, puede estar ejecutando un shell de inicio de sesión. Cuando ejecuta screen, está ejecutando un shell interactivo sin inicio de sesión.

La diferencia está en qué scripts de inicio se ejecutan.

  • /etc/bash.bashrcluego ~/.bashrcse obtienen cuando se inicia un shell interactivo sin inicio de sesión

  • /etc/profilea continuación, el primero encontrado de ~/.bash_profile, ~/.bash_loginy ~/.profilese obtienen cuando se inicia una shell de entrada interactivo

Esto puede estar afectando a usted.

También verificaría si $TERMes diferente.

Pausado hasta nuevo aviso.
fuente
2

screen no reemplaza bash, lo ejecuta o cualquier otro shell. tal vez se está ejecutando csh, zsho bashpero con diferentes parámetros.

Lo primero que intentaría es verificar psy /proc/<pid>/cmdlineestar seguro de que está usando el mismo shell con los mismos parámetros que lo loginhace.

después de eso, verifique /etc/screenrcy cualquier otro archivo mencionado en la man screensección ARCHIVOS.

Javier
fuente
Ejecuté un pscomando y muestra que se bashestá ejecutando (este es un comando ps dentro de la pantalla) ... Obtuve el color funcionando (arriba) solo necesito completar la pestaña.
Thornomad
2

Tuve el mismo problema, cuando ejecuté la pantalla, perdí el mensaje de color PS1 que encontré hábilmente: P.

El problema es que lo estaba ejecutando así en ~ / .bash_profile

PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

Eso significa que cuando la pantalla estaba ejecutando bash_profile, la PS1 no se estaba transfiriendo.

La solución es fácil: agregue la exportación a la instrucción PS1 en ~. / Bash_profile para que se vea así:

export PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

Así, la variable no se pierde en la ejecución anidada.

davidsaliba
fuente
1

Solo quiero agregar algo sobre "defshell -bash" (que acabo de descubrir, después de meses de rascarse la cabeza). Cuando haces eso, el shell hijo ejecutado por pantalla tiene $ SHELL establecido en "bash", en lugar de "/ bin / bash" como normalmente sería. Si luego ejecuta "script" dentro de su sesión de pantalla, obtendrá:

$ script
Script started, file is typescript
script: failed to execute bash: No such file or directory

O al menos eso es lo que sucede en mi caja Ubuntu 14.04. La solución que he estado usando es ejecutar $ SHELL=/bin/bash script. Me imagino que tener $ SHELL mal configurado romperá otras cosas, pero el script es lo que he notado.

Roy Smith
fuente
0

Estoy usando este fragmento en mi .profileantes de que se inicie cualquier inicialización de shell: which screen > /dev/null 2>&1 && { screen -q -ls if [ $? -gt 10 ]; then read -p "$(tput setaf 2)Found a running SCREEN sesion, attach?$(tput sgr0)[Y/n] " y >&2 if [ "${y:-y}" = "y" -o "$y" = "Y" ]; then screen -aDR && logout fi else echo "$(tput setaf 3)No running SCREEN sessions found.$(tput sgr0)" >&2 fi }

Entonces, si no se está ejecutando una sesión de pantalla, yo ... bueno, no caigo en el indicador de comandos estándar. Hay una solicitud más para la sudocontraseña (ya que el 99% del tiempo me conecto para administrar el servidor), y si planeo realizar una tarea larga, cancelo el inicio de sesión de sudo, inicio la pantalla manualmente en la sesión de mi usuario y sudo allí.

El punto clave aquí es "antes de cualquier inicialización de shell", de modo que cuando ya tiene una sesión de pantalla en ejecución, ya se inicializa con la configuración regional y otras cosas y no necesita volver a hacerlo.

AnrDaemon
fuente