29 votos

¿Cómo puedo hacer Ctrl-Z y bg en una sola pulsación para que el proceso continúe en segundo plano?

Sigo este patrón de suspender la tarea y luego dejar que continúe demasiado a menudo con la Ctrl-Z bg secuencia.

Me preguntaba si hay alguna forma de comprimir eso a una sola pulsación de tecla.

Mi Shell es zsh

0 votos

Quiero decir que probablemente esté codificado. Pero no estoy 100%

0 votos

Claro que sí, pero he encontrado la solución elegante, gracias superuser.com/a/161922/35223

27voto

Gilles Puntos 37591

El Ctrl + Z es manejada por la terminal, no por el Shell. (Antecedentes útiles: ¿Cuál es la diferencia exacta entre un 'terminal', un 'Shell', un 'tty' y una 'consola'? )

Sólo un pequeño conjunto no ampliable de funciones puede ser vinculado a una tecla en un terminal . Usted puede personalizar las teclas vinculado a estas funciones, pero no añadir otra función. Estas funciones se dividen en tres categorías:

  • Edición en la línea de comandos en programas que no proporcionan el suyo propio (modo canónico, también llamado modo cocinado (por oposición con el modo crudo), que raramente utilizarás en la práctica): fin de archivo ( eof , Ctrl + D ), fin de línea ( eol , Ctrl + M ), borrar el carácter izquierdo ( erase , Ctrl + H ), borrar palabra a la izquierda ( werase , Ctrl + W ), línea de borrado ( kill , Ctrl + U ).
  • Control de flujo manual: stop ( Ctrl + S ), start ( Ctrl + Q ). Sólo es útil en los antiguos terminales de serie que dejaban caer los caracteres cuando el terminal no podía seguir el ritmo del ordenador o viceversa.
  • Señalización: interrupción ( 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 se necesitaría soporte tanto en el controlador de terminal en el kernel, como en el emulador de terminal. Así que hay que conformarse con la suspensión, que envía al trabajo en primer plano un SIGTSTP señal. Esto desencadena una SIGCHLD en el proceso padre del líder del trabajo en primer plano, que suele ser el Shell. Cuando el Shell recibe SIGCHLD, llama a waitpid para averiguar por qué fue notificado, y al detectar que un trabajo en segundo plano fue suspendido, muestra una notificación (por ejemplo [1] + 12345 suspended mycommand ) y una nueva indicación.

Se podría programar el Shell para enviar un 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 manera de que zsh sepa si realmente quieres interrumpir el programa (oops, este programa puede estar haciendo algo incorrecto, déjame suspenderlo mientras lo resuelvo) o ponerlo en segundo plano.


Lo que hago es poner el Ctrl + Z secuencia de teclas en zsh para poner en segundo plano el trabajo actual ( %% ). De esta manera, puedo enviar el trabajo en primer plano al fondo pulsando Ctrl + Z Ctrl + Z . Mientras estoy en ello, hago Ctrl + Z hacer algo más útil cuando la línea de entrada actual no está vacía (por lo que no acabo de volver de un subproceso): "suspender" la línea de entrada actual, permitiéndome escribir otro comando, después de lo cual la línea interrumpida es empujada de nuevo al buffer 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

0 votos

Gilles, esta es una respuesta increíblemente completa, educativa y reflexiva que no podía esperar. ¡Muchas gracias!

4voto

JohnLittle Puntos 59

^z ^z como zsh arriba es posible en bash, aunque es un poco kludgy y no he corrido esto por mucho tiempo:

  • En su .inputrc incluya el mapeo "\C-z": "bg\n"
  • En la variable bash PS0 incluya `$(stty susp ^z)'
  • En la variable bash PROMPT_COMMAND incluya 'stty susp ^@'

así que ^z para suspender se activa cuando se ejecuta un comando, y luego se desactiva para el prompt de bash.

1voto

Klathzazt Puntos 1694

Así que encontró la solución, no es exactamente lo que quiero, pero muy cerca de aquí http://superuser.com/a/161922/35223

En una línea de comandos vacía se ejecuta bg (para que Ctrl+Z suspenda un programa y lo reanude inmediatamente en segundo plano).

0 votos

Debo notar que esto requiere zsh; no está soportado en bash. (fuera de la caja, de todos modos)

0 votos

@KevinM Puedes escribir una función análoga en bash (al menos la versión básica haciendo Ctrl+Z llame a bg No estoy seguro de detectar una línea de entrada no vacía).

0voto

octern Puntos 223

¿Son estos comandos los que querías ejecutar en primer plano inicialmente, y luego cambiar al fondo? No sé si hay una forma más sencilla de hacerlo. Pero si quieres ejecutar comandos que estarán en segundo plano al principio, puedes simplemente añadir un ampersand al final de la línea. e.g., ping google.com & comenzará a hacer ping en segundo plano; no podrá interactuar con él a menos que escriba fg .

1 votos

Gracias, el problema es que a veces no tienes idea del tiempo que tomaría ejecutar el comando, así que lo ejecutas interactivamente y luego te das cuenta que mejor lo dejas continuar en segundo plano. ¡La respuesta aceptada me funciona de maravilla, la uso a diario!

0 votos

Gracias por la respuesta. La respuesta aceptada está muy bien.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: