GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso premere Ctrl-Z e bg in un tasto per far continuare il processo in background?

Il Ctrl +Z la sequenza è gestita dal terminale, non dalla shell. (Contesto utile:qual è la differenza esatta tra un 'terminale', una 'shell', una 'tty' e una 'console'?)

Solo un piccolo insieme non estendibile di funzioni può essere associato a una chiave in un terminale. È possibile personalizzare i tasti associati a queste funzioni ma non aggiungere un'altra funzione. Queste funzioni rientrano in tre categorie:

  • Edizione della riga di comando nei programmi che non ne forniscono una propria (modalità canonica, detta anche modalità cotta (per opposizione alla modalità raw), che userai raramente nella pratica):fine del file (eof , Ctrl +Re ), fine riga (eol , Ctrl +M ), cancella il carattere rimasto (erase , Ctrl +H ), cancella la parola sinistra (werase , Ctrl +W ), cancella la riga (kill , Ctrl +U ).
  • Controllo manuale del flusso:stop (Ctrl +S ), start (Ctrl +D ). Utile solo su vecchi terminali seriali che rilasciavano caratteri quando il terminale non riusciva a tenere il passo con il computer o viceversa.
  • Segnalazione:interruzione (intr , Ctrl +C ), forza l'uscita (quit , Ctrl +\ ), sospendi (Ctrl +Z ).

Alcuni sistemi, incluso Linux, estendono quell'elenco, ma non ne ho mai visto uno che includesse il background. Si noti che richiederebbe il supporto sia nel driver di terminale nel kernel, sia nell'emulatore di terminale. Quindi devi accontentarti della sospensione, che invia al lavoro in primo piano un segnale SIGTSTP. Ciò attiva un SIGCHLD nel processo padre del leader del lavoro in primo piano, che di solito è la shell. Quando la shell ha ricevuto SIGCHLD, chiama waitpid per capire perché è stato notificato e, quando rileva che un lavoro in background è stato sospeso, visualizza una notifica (ad es. [1] + 12345 suspended mycommand ) e un nuovo prompt.

Potresti programmare la shell per inviare un SIGCONT segnale al lavoro in primo piano. Non credo che zsh abbia un hook per questo, avresti bisogno di patchare il codice sorgente. E non c'è modo per zsh di sapere se intendevi davvero interrompere il programma (oops, questo programma potrebbe fare la cosa sbagliata, lasciami sospendere mentre lo risolvo) o metterlo in secondo piano.

Quello che faccio è impostare Ctrl +Z sequenza di tasti in zsh per mettere in background il lavoro corrente (%% ). In questo modo, posso inviare il lavoro in primo piano sullo sfondo premendo Ctrl +Z Ctrl +Z . Già che ci sono, faccio Ctrl +Z fare qualcos'altro di utile quando la riga di input corrente non è vuota (quindi non sono appena tornato da un sottoprocesso):"sospendere" la riga di input corrente, permettendomi di digitare un altro comando, dopodiché la riga interrotta viene reinserita in il buffer di input.

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 come zsh sopra è possibile in bash, anche se è un po' complicato e non lo eseguo da molto tempo:

  • Nel tuo .inputrc includi la mappatura "\C-z": "bg\n"
  • Nella variabile bash PS0 includi `$(stty susp ^z)'
  • Nella variabile bash PROMPT_COMMAND includi 'stty susp ^@'

quindi ^z per la sospensione viene attivato quando viene eseguito un comando, quindi disattivato per il prompt di bash.


Linux
  1. Come ottenere l'ID processo del processo in background?

  2. Come eseguire Node.js come processo in background e non morire mai?

  3. Come creare e applicare la patch SVN?

  4. Come eseguire la ricerca inversa avanti e indietro?

  5. come posso cercare i file e comprimerli in un unico file zip

Come avviare il comando Linux in background e scollegare il processo nel terminale

[Suggerimenti Bash] Come fare cd e ls in un comando

[Suggerimenti Bash] Come cp o mv e cd in un comando

Come lavorare con il processo in primo piano e in background in Linux

Posso limitare un utente (e le sue app) a un'unica interfaccia di rete?

Come modificare tutti i thread (e i figli) di un processo su Linux?