GNU/Linux >> Tutoriales Linux >  >> Linux

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

El Ctrl +Z La secuencia 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'?)

Solo un pequeño conjunto de funciones no extensibles se puede vincular a una tecla en una terminal. Puede personalizar las teclas vinculadas a estas funciones pero no agregar otra función. Estas funciones se dividen en tres categorías:

  • Edición de la línea de comandos en programas que no proporcionan los suyos propios (modo canónico, también llamado modo cocinado (por oposición al modo sin procesar), que rara vez usará en la práctica):fin de archivo (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 ).
  • Control de flujo manual:stop (Ctrl +S ), start (Ctrl +Q ). Solo es útil en terminales seriales antiguos que pierden caracteres cuando el terminal no puede seguir el ritmo de la computadora o viceversa.
  • Señalización:interrupción (intr , Ctrl +C ), forzar salida (quit , Ctrl +\ ), suspender (Ctrl +Z ).

Algunos sistemas, incluido Linux, amplían esa lista, pero nunca he visto uno que incluyera el fondo. Tenga en cuenta que necesitaría soporte tanto en el controlador de terminal en el kernel como en el emulador de terminal. Así que tienes que conformarte 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 suele ser el shell. Cuando el shell recibe SIGCHLD, llama a waitpid para averiguar por qué se notificó y, al detectar que se suspendió un trabajo en segundo plano, muestra una notificación (por ejemplo, [1] + 12345 suspended mycommand ) y un mensaje nuevo.

Podrías programar el shell para enviar un SIGCONT señal al trabajo en primer plano. No creo que zsh tenga un gancho para eso, necesitarías parchear el código fuente. Y no hay forma de que zsh sepa si realmente querías 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 el Ctrl +Z secuencia de teclas en zsh para poner en segundo plano el trabajo actual (%% ). De esa manera, puedo enviar el trabajo de primer plano al segundo plano presionando Ctrl +Z Ctrl +Z . Mientras estoy en eso, hago Ctrl +Z haga otra cosa ú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, permitiéndome escribir otro comando, después de lo cual la línea interrumpida se vuelve a colocar en 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 confuso y no lo he ejecutado por mucho tiempo:

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

por lo tanto, ^z para suspender se activa cuando se ejecuta un comando, luego se desactiva para el aviso de bash.


Linux
  1. ¿Cómo obtener el ID de proceso del proceso en segundo plano?

  2. ¿Cómo hacer y aplicar el parche SVN?

  3. ¿Cómo invertir-i-buscar de ida y vuelta?

  4. ¿Cómo puedo buscar archivos y comprimirlos en un archivo zip?

  5. ¿Cómo puedo hacer que la sesión de sudo sea de una hora y no de unos minutos en Ubuntu 10.04?

Cómo iniciar el comando de Linux en segundo plano y separar el proceso en la terminal

[Consejos de Bash] Cómo cd y ls en un solo comando

[Consejos de Bash] Cómo cp o mv y cd en un solo comando

Cómo trabajar con procesos en primer plano y en segundo plano en Linux

¿Puedo limitar un usuario (y sus aplicaciones) a una interfaz de red?

¿Cómo mejorar todos los subprocesos (y niños) de un proceso en Linux?