Sigo este patrón de suspender la tarea y luego dejar que continúe con demasiada frecuencia con la Ctrl-Z bgsecuencia.
Me preguntaba ¿hay alguna forma de comprimir eso con solo presionar una tecla?
Mi caparazón es zsh
Sigo este patrón de suspender la tarea y luego dejar que continúe con demasiada frecuencia con la Ctrl-Z bgsecuencia.
Me preguntaba ¿hay alguna forma de comprimir eso con solo presionar una tecla?
Mi caparazón es zsh
Respuestas:
La secuencia Ctrl+ Zes manejada por el terminal, no por el shell. (Antecedentes útiles: ¿Cuál es la diferencia exacta entre un 'terminal', un 'shell', un 'tty' y una 'consola'? )
Solo un pequeño conjunto de funciones no extensible puede vincularse a una tecla en un terminal . Puede personalizar las teclas vinculadas a estas funciones pero no agregar otra función. Estas funciones se dividen en tres categorías:
eof
, Ctrl+ D), fin de línea ( eol
, Ctrl+ M), borrar carácter a la izquierda ( erase
, Ctrl+ H), borrar palabra a la izquierda ( werase
, Ctrl+ W), borrar línea ( kill
, Ctrl+ U).stop
( Ctrl+ S), start
( Ctrl+ Q). Solo es útil en terminales seriales antiguas que soltaron caracteres cuando el terminal no podía seguir el ritmo de la computadora o viceversa.intr
, Ctrl+ C), forzar el abandono ( quit
, Ctrl+ \), suspender ( Ctrl+ Z).Algunos sistemas, incluido Linux, amplían esa lista, pero nunca he visto uno que incluya el fondo. Tenga en cuenta que necesitaría soporte tanto en el controlador de terminal en el kernel como en el emulador de terminal. Entonces tiene que conformarse con suspender, que envía al trabajo en primer plano una señal SIGTSTP . Esto desencadena un SIGCHLD en el proceso principal del líder del trabajo en primer plano, que generalmente es el shell. Cuando el shell recibió SIGCHLD, llama waitpid
para averiguar por qué fue notificado, y al detectar que se suspendió un trabajo en segundo plano, muestra una notificación (por ejemplo [1] + 12345 suspended mycommand
) y una nueva solicitud.
Puede programar el shell para enviar una SIGCONT
señal al trabajo en primer plano. No creo que zsh tenga un gancho para eso, tendrías que parchear el código fuente. Y no hay forma de que zsh sepa si realmente quisiste interrumpir el programa (vaya, este programa puede estar haciendo algo incorrecto, déjame suspenderlo mientras lo soluciono) o ponerlo en segundo plano.
Lo que hago es establecer la secuencia de teclas Ctrl+ Zen zsh para poner en segundo plano el trabajo actual ( %%
). De esa manera, puedo enviar el trabajo en primer plano al fondo presionando Ctrl+ Z Ctrl+ Z. Mientras estoy en ello, hago Ctrl+ Zhacer algo más útil cuando la línea de entrada actual no está vacía (por lo que no acabo de regresar de un subproceso): "suspender" la línea de entrada actual, lo que me permite escribir otro comando , después de lo cual la línea interrumpida se empuja hacia el búfer de entrada.
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
bg
zle redisplay
else
zle push-input
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
^ z ^ z como zsh anterior es posible en bash, aunque es un poco torpe y no he ejecutado esto por mucho tiempo:
"\C-z": "bg\n"
entonces ^ z para suspender se activa cuando se ejecuta un comando, luego se desactiva para el indicador de bash.
Entonces encontré la solución, no exactamente lo que quiero, pero muy cerca de aquí /superuser//a/161922/35223
En una línea de comando vacía se ejecuta bg (de modo que Ctrl + Z Ctrl + Z suspende un programa y lo reanuda inmediatamente en segundo plano).
Ctrl+Z
llamada bg
, no estoy seguro de detectar una línea de entrada no vacía).
¿Son estos comandos que quería ejecutar en primer plano inicialmente y luego cambiar a segundo plano? No sé si hay una manera más sencilla de hacerlo. Pero si desea ejecutar comandos que estarán en segundo plano para comenzar, simplemente puede agregar un ampersand al final de la línea. por ejemplo, ping google.com &
comenzará a hacer ping en segundo plano; no podrá interactuar con él a menos que escriba fg
.