Guía de supervivencia de pantalla GNU [cerrado]
-
09-06-2019 - |
Pregunta
¿Cuáles cree la gente que son no sólo las cosas esenciales que necesitas saber sobre la excelente utilidad Screen, sino también las cosas que crees que vale la pena enseñarle a alguien, un principiante, desde cero?
Acabo de presentarle Screen a un amigo y le está costando acostumbrarse.Entonces analogías y consejos útiles para recordar enlaces, etc.sería grandioso.
Solución
He estado usando Screen durante más de 10 años y probablemente uso menos de la mitad de las funciones.Por lo tanto, definitivamente no es necesario aprender todas sus funciones de inmediato (y no recomendaría intentarlo).Mis comandos del día a día son:
^A ^W - window list, where am I
^A ^C - create new window
^A space - next window
^A p - previous window
^A ^A - switch to previous screen (toggle)
^A [0-9] - go to window [0-9]
^A esc - copy mode, which I use for scrollback
Creo que eso es todo.A veces uso las funciones de pantalla dividida, pero ciertamente no a diario.El otro consejo es que si la pantalla parece haberse bloqueado porque presionaste alguna combinación de teclas aleatoria por accidente, haz ^Q y ^A ^Q para intentar desbloquearla.
Otros consejos
No pude acostumbrarme a la pantalla hasta que encontré una manera de configurar una 'barra de estado' en la parte inferior de la pantalla que muestra en qué 'pestaña' o 'pantalla virtual' estás y cuáles hay.He aquí mi arreglo:
[roel@roel ~]$ cat .screenrc
# Here comes the pain...
caption always "%{=b dw}:%{-b dw}:%{=b dk}[ %{-b dw}%{-b dg}$USER%{-b dw}@%{-b dg}%H %{=b dk}] [ %= %?%{-b dg}%-Lw%?%{+b dk}(%{+b dw}%n:%t%{+b dk})%?(%u)%?%{-b dw}%?%{-b dg}%+Lw%? %{=b dk}]%{-b dw}:%{+b dw}:"
backtick 2 5 5 $HOME/scripts/meminfo
hardstatus alwayslastline "%{+b dw}:%{-b dw}:%{+b dk}[%{-b dg} %0C:%s%a %{=b dk}]-[ %{-b dw}Load%{+b dk}:%{-b dg}%l %{+b dk}] [%{-b dg}%2`%{+b dk}] %=[ %{-b dg}%1`%{=b dk} ]%{-b dw}:%{+b dw}:%<"
sorendition "-b dw"
[roel@roel ~]$ cat ~/scripts/meminfo
#!/bin/sh
RAM=`cat /proc/meminfo | grep "MemFree" | awk -F" " '{print $2}'`
SWAP=`cat /proc/meminfo | grep "SwapFree" | awk -F" " '{print $2}'`
echo -n "${RAM}kb/ram ${SWAP}kb/swap"
[roel@roel ~]$
Control+A ?- ¡muestra la pantalla de ayuda!
Si tu amigo tiene la costumbre de presionar ^A
para llegar al principio de la línea en bash, se encontrará con algunas sorpresas, ya que ^A
es la combinación de teclas del comando de pantalla.Generalmente termino con una pantalla congelada, posiblemente debido a alguna tecla aleatoria que presioné después ^A
:-)
En esos casos lo intento
^A s
y ^A q
bloquear/desbloquear el desplazamiento del terminal
para arreglar eso.Para ir al principio de una línea dentro de la pantalla, la secuencia de teclas es ^A a
Puede reasignar la tecla de escape de Ctrl-A para que sea otra tecla de su elección, de modo que si la usa para otra cosa, p.para ir al principio de la línea en bash, solo necesita agregar una línea a su archivo ~/.screenrc.Para hacerlo ^b o ^B use:
escape ^bB
Desde la línea de comando, use nombres de sesiones para mantener varias sesiones bajo control.Utilizo una sesión por tarea, cada una con varias pestañas:
screen -ls lists your current screen sessions screen -S <name> creates a new screen session called name screen -r <name> connects to the named screen sessions
Cuando usas la pantalla solo necesitas algunos comandos:
^A c create a new shell ^A [0-9] switch shell ^A k kill the current shell ^A d disconnect from screen ^A ? show the help
Se puede encontrar una excelente referencia rápida. aquí.Vale la pena marcarlo como favorito.
Algunos consejos para aquellos que están familiarizados con la pantalla, pero que tienden a no recordar lo que leen en la página de manual:
- Cambiar el nombre de una ventana de pantalla es muy fácil: control+A cambio+A.
- ¿Te perdiste el último mensaje de la pantalla? control+a control+metro Se lo mostraré nuevamente.
- Si desea ejecutar algo (como seguir un archivo) y que la pantalla le indique cuándo hay un cambio, use control+A cambio+metro en la ventana de destino.Advertencia:te avisará si cualquier cosa cambios.
- ¿Quiere seleccionar la ventana 15 directamente?Pruebe estos en su
.screenrc
archivo:
bind ! select 11 bind @ select 12 bind \# select 13 bind $ select 14 bind % select 15 bind \^ select 16 bind & select 17 bind * select 18 bind ( select 19 bind ) select 10
que asigna control+a cambio+0 a 9 para ventanas 10 a 19.
http://www.debian-administration.org/articles/34
Lo escribí hace un par de años, pero sigue siendo una buena introducción que recibe muchos comentarios positivos.
"Debo" agregar esto:agregar
bind s
para usted .screenrc
, si usted, como yo, solía usar ventanas divididas, como C-a S
divide la ventana real, pero C-a s
lo congela.Así que desactivé el atajo de congelación.
control+a es una clave especial.
control+a d - [d]each, dejar los programas (¿irssi?) en segundo plano, volver a casa.
control+a C [c]rear una nueva ventanacontrol+a 0-9 cambiar entre ventanas por número
pantalla -r - volver a la sesión separada
Eso cubre el 90% de los casos de uso.No intente mostrar todas las funciones a la vez.
Control+A es el comando base
Control+A norte = ir a la ***N***pantalla siguiente
Control+A PAG = ir a la ***P***pantalla anterior
Control+A C = ***C***crear nueva pantalla
Control+A D = ***D***separa tu pantalla
No es realmente esencial, no sólo en relación con la pantalla, sino habilitando 256 colores en mi terminal, GNU Screen y Vim Mejoré mi experiencia de pantalla a lo grande (especialmente porque codifico en Vim aproximadamente 8 horas al día; hay algunos esquemas de colores excelentes y agradables a la vista).
hay algunos trabajo interesante Se está haciendo para obtener una buena configuración de pantalla gnu de forma predeterminada en la próxima versión de Ubuntu Server, lo que incluye el uso de la parte inferior de la pantalla para mostrar todas las ventanas, así como otros detalles útiles de la máquina (como el número de actualizaciones disponibles y si la máquina necesita reiniciar).Probablemente puedas agarrar su .screenrc
y personalízalo según tus necesidades.
Los comandos más útiles que tengo en mi .screenrc
son los siguientes
shelltitle "$ |bash" # make screen assign window titles automatically
hardstatus alwayslastline "%w" # show all window titles at bottom line of term
De esta manera siempre sé qué ventanas están abiertas y qué se está ejecutando en ellas en ese momento también.
La primera modificación que hago a .screenrc es cambiar el comando de escape.Al igual que a muchos de ustedes, no me gusta la secuencia Ctrl-A predeterminada debido a su interferencia con esa funcionalidad fundamental en casi todos los demás contextos.En mi archivo .screenrc, agrego:
escapar `e
Eso es comilla invertida.
Esto me permite utilizar la comilla invertida como tecla de escape (p. ej.para crear una nueva pantalla, presiono backtick-c, separar es backtick-d, backtick-?es ayuda, backtick-backtick es la pantalla anterior, etc.).La única forma en que interfiere (y tuve que dejar el hábito) es usar un acento grave en la línea de comando para capturar el resultado de la ejecución o pegar cualquier cosa que contenga un acento grave.Para el primero, modifiqué mi hábito usando la convención BASH $(comando).Para este último, normalmente abro otro xterm o lo separo de la pantalla y luego pego el contenido que contiene la comilla invertida.Finalmente, si deseo insertar una comilla invertida literal, simplemente presiono comillas invertidas-e.
No recuerdo a quién le robé esto (alguien en dotfile.org).Lo modifiqué ligeramente para ssh:
#!/bin/sh
# scr - Runs a command in a fresh screen
#
# Get the current directory and the name of command
wd=`pwd`
cmd=$1
shift
# We can tell if we are running inside screen by looking
# for the STY environment variable. If it is not set we
# only need to run the command, but if it is set then
# we need to use screen.
if [ -z "$STY" ]; then
$cmd $*
else
# Screen needs to change directory so that
# relative file names are resolved correctly.
screen -X chdir $wd
# Ask screen to run the command
if [ $cmd == "ssh" ]; then
screen -X screen -t ""${1##*@}"" $cmd $*
else
screen -X screen -t "$cmd $*" $cmd $*
fi
fi
Luego configuro los siguientes alias de bash:
vim() {
scr vim $*
}
man() {
scr man $*
}
info() {
scr info $*
}
watch() {
scr watch $*
}
ssh() {
scr ssh $*
}
Abre una nueva pantalla para los alias anteriores y, si usa ssh, cambia el nombre del título de la pantalla con el nombre de host ssh.
Saludos z0mbix
Me gusta configurar una sesión de pantalla con nombres descriptivos para las ventanas.^a A le permitirá darle un nombre a la ventana actual y ^a " le dará una lista de sus ventanas.Cuando termine, separe la pantalla con ^a d y vuelva a conectarla con screen -R
Alguien ha publicado una pregunta similar a esta en Fallo del servidor.
me gusta usar screen -d -RR
para crear/adjuntar automáticamente a una pantalla determinada.Creé funciones bash para hacerlo más fácil...
function mkscreen
{
local add=n
if [ "$1" == '-a' ]; then
add=y
shift;
fi
local name=$1;
shift;
local command="$*";
if [ -z "$name" -o -z "$command" ]; then
echo 'Usage: mkscreen [ -a ] name command
-a Add to .bashrc.' 1>&2;
return 1;
fi
if [ $add == y ]; then
echo "mkscreen $name $command" >> $HOME/.bashrc;
fi
alias $name="/usr/bin/screen -d -RR -S $name $command";
return 0;
}
function rmscreen
{
local delete=n
if [ "$1" == '-d' ]; then
delete=y
shift;
fi
local name=$1;
if [ -z "$name" ]; then
echo 'Usage: rmscreen [ -d ] name
-d Delete from .bashrc.' 1>&2;
return 1;
fi
if [ $delete == y ]; then
sed -i -r "/^mkscreen $name .*/d" $HOME/.bashrc;
fi
unalias $name;
return 0;
}
Crean un alias para /usr/bin/screen -d -RR -S $name $command
.Por ejemplo, me gusta usar irssi en una sesión de pantalla, por lo que en mi .bashrc (debajo de esas funciones), tengo:
mkscreen irc /usr/bin/irssi
Entonces puedo simplemente escribir irc
en una terminal para entrar a irssi.Si la pantalla 'irc' aún no existe, se crea y se ejecuta /usr/bin/irssi desde ella (que se conecta automáticamente, por supuesto).Si ya se está ejecutando, simplemente lo vuelvo a conectar, desconectando a la fuerza cualquier otra instancia que ya esté adjunta.Es bastante bonito.
Otro ejemplo es la creación de alias de pantalla temporales para perldocs a medida que los encuentro:
mkscreen perlipc perldoc perlipc
perlipc # Start reading the perldoc, ^A d to detach.
...
# Later, when I'm done reading it, or at least finished
# with the alias, I remove it.
rmscreen perlipc
La opción -a (debe ser el primer argumento) agrega el alias de pantalla a .bashrc (por lo que es persistente) y -d lo elimina (estos pueden ser potencialmente destructivos, así que utilícelos bajo su propia responsabilidad).xDD
Adjuntar:
Otro bashismo que encuentro conveniente cuando trabajo mucho con la pantalla:
alias sls='/usr/bin/screen -ls'
De esa manera, puede enumerar sus pantallas con muchas menos pulsaciones de teclas.no se si sls
choca con cualquier utilidad existente, pero no lo hizo en ese momento en mi sistema, así que lo intenté.
^A A vuelve a la pantalla de la que acaba de salir.
^A es un gran carácter especial para la gente de UNIX, pero si usas la pantalla para hablar con OpenVMS, entonces no poder ^A te dejará calvo prematuramente.En VMS, si está editando un comando DCL antes de la ejecución desde el búfer de historial, el modo Insertar está desactivado (tiene que estarlo por algunas razones que no abordaré aquí).para activarlo y no escribir demasiado el comando en lugar de espaciar las cosas, debes presionar ^A