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.