Come posso fare Ctrl-Z e bg in una sola pressione per far continuare il process in background?

Seguo questo model di sospensione del task e poi lasciandolo continuare troppo spesso con la sequenza Ctrl-Z bg .

Mi stavo chiedendo se ci sia un modo per comprimerlo a singolo tasto?

La mia shell è zsh

La sequenza Ctrl + Z viene gestita dal terminal, non dalla shell. (Priorità utile: Qual è la differenza esatta tra un 'terminal', un 'shell', un 'tty' e una 'console'? )

Solo un piccolo gruppo di funzioni non estensibile può essere associato a una chiave in un terminal . È ansible personalizzare le chiavi legate a queste funzioni, ma non aggiungere un'altra function. Queste funzioni rientrano in tre categorie:

  • Edizione di row di command nei programmi che non forniscono la propria (modalità canonica, chiamata anche modalità cotta (in opposizione alla modalità raw), che raramente verrà utilizzata in pratica): fine file ( eof , Ctrl + D ), fine della linea ( eol , Ctrl + M ), cancellare il carattere sinistro ( erase , Ctrl + H ), cancellare la parola sinistra ( werase , Ctrl + W ), cancellare la linea ( kill , Ctrl + U ).
  • Controllo manuale del stream: stop ( Ctrl + S ), start ( Ctrl + Q ). È utile solo su vecchi terminali seriali che hanno lasciato caratteri quando il terminal non è in grado di tenere il passo con il computer o viceversa.
  • Segnalazione: interrompere ( intr , Ctrl + C ), abbandonare la forza ( quit , Ctrl + \ ), sospendere ( Ctrl + Z ).

Alcuni sisthemes, tra cui Linux, estendono tale elenco, ma non ho mai visto uno che includesse lo background. Si noti che sarebbe richiesto sia il driver terminal nel kernel che l'emulatore terminal. Quindi bisogna fare sospendere, che trasmette il lavoro in primo piano un segnale SIGTSTP . Questo triggers un SIGCHLD nel process principale 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 viene rilevato che un lavoro di background è stato sospeso, visualizza una notifica (ad esempio [1] + 12345 suspended mycommand ) e un nuovo prompt.

È ansible programmare la shell per submit un segnale SIGCONT al lavoro in primo piano. Non credo che zsh abbia un hook per questo, avresti bisogno di patch il codice sorgente. E non c'è modo per sapere se hai davvero intenzione di interrompere il programma (oops, questo programma potrebbe fare la cosa sbagliata, lasciathemes sospenderlo mentre lo ordini) oppure per farlo.


Quello che faccio è impostare la sequenza di tasti Ctrl + Z in zsh in background il lavoro corrente ( %% ). In questo modo, posso submit il lavoro in primo piano allo background premendo Ctrl + Z Ctrl + Z. Mentre sono a questo punto, faccio Ctrl + Z fare qualcosa di utile quando la linea di input corrente non è vuota (quindi non sono tornato da un sottoprocess): "Sospendi" la linea di input corrente, che mi permette di digitare un altro command, dopo di che la linea interrotta viene spinta indietro nel 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 

Quindi ho trovato la soluzione, non esattamente quello che voglio, ma darn close da qui https://superuser.com/a/161922/35223

Su una row di command vuota eseguire bg (in modo che Ctrl + Z Ctrl + Z sospenda un programma e lo riprenda immediatamente in background).

Questi comandi volevamo inizialmente eseguire in primo piano e poi passare allo background? Non so se c'è un modo più semplice per farlo. Ma se vuoi eseguire comandi che saranno in background per iniziare, puoi aggiungere un ampersand alla fine della row. ad esempio ping google.com & inizierà a pingare in background; non sarai in grado di interagire con esso a less che non digitate fg .