Seguo questo schema di sospensione dell'attività e quindi di lasciarla continuare troppo spesso con la Ctrl-Z bgsequenza.
Mi chiedevo c'è un modo per comprimerlo in un singolo tasto?
La mia shell è zsh
Seguo questo schema di sospensione dell'attività e quindi di lasciarla continuare troppo spesso con la Ctrl-Z bgsequenza.
Mi chiedevo c'è un modo per comprimerlo in un singolo tasto?
La mia shell è zsh
Risposte:
La sequenza Ctrl+ Zè gestita dal terminale, non dalla shell. (Background utile: qual è la differenza esatta tra un 'terminale', una 'shell', una 'tty' e una 'console'? )
Solo un piccolo set di funzioni non estendibile 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:
eof
, Ctrl+ D), end of line ( eol
, Ctrl+ M), cancella il carattere a sinistra ( erase
, Ctrl+ H), cancella la parola a sinistra ( werase
, Ctrl+ W), cancella la linea ( kill
, Ctrl+ U).stop
( Ctrl+ S), start
( Ctrl+ Q). Utile solo sui vecchi terminali seriali che lasciavano cadere i caratteri quando il terminale non riusciva a tenere il passo con il computer o viceversa.intr
, Ctrl+ C), chiusura forzata ( quit
, Ctrl+ \), sospensione ( Ctrl+ Z).Alcuni sistemi, incluso Linux, estendono tale elenco, ma non ne ho mai visto uno che includesse lo sfondo. Si noti che richiederebbe supporto sia nel driver del terminale nel kernel, sia nell'emulatore di terminale. Quindi devi accontentarti della sospensione, che invia al lavoro in primo piano un segnale SIGTSTP . Ciò innesca 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é è stata notificata e, al rilevamento di un processo in background sospeso, visualizza una notifica (ad es. [1] + 12345 suspended mycommand
) E un nuovo prompt.
È possibile programmare la shell per inviare un SIGCONT
segnale al lavoro in primo piano. Non credo che zsh abbia un gancio per questo, avresti bisogno di patchare il codice sorgente. E non c'è modo per zsh di sapere se intendevi veramente interrompere il programma (oops, questo programma potrebbe fare la cosa sbagliata, lasciami sospenderlo mentre lo risolvo) o metterlo in background.
Quello che faccio è impostare la sequenza di tasti Ctrl+ Zin 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. Mentre ci sono, faccio Ctrl+ Zfare qualcos'altro utile quando la riga di input corrente non è vuota (quindi non sono appena tornata da un sottoprocesso): "sospendi" la riga di input corrente, permettendomi di digitare un altro comando , dopo di che la linea interrotta viene reinserita 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
^ z ^ z come zsh sopra è possibile in bash, anche se è un po 'kludgy e non lo eseguo da molto:
"\C-z": "bg\n"
così ^ z per suspend viene attivato quando viene eseguito un comando, quindi disattivato per il prompt di bash.
Quindi ho trovato la soluzione, non esattamente quello che voglio ma dannatamente vicino da qui /superuser//a/161922/35223
Su una riga di comando vuota viene eseguito bg (in modo che Ctrl + Z Ctrl + Z sospenda un programma e lo riprenda immediatamente in background).
Ctrl+Z
chiamata bg
, non sono sicuro di rilevare una linea di input non vuota).
Sono questi comandi che volevi eseguire inizialmente in primo piano e quindi passare allo sfondo? Non so se esiste un modo più semplice per farlo. Ma se vuoi eseguire comandi che saranno in background per cominciare, puoi semplicemente aggiungere una e commerciale alla fine della riga. ad esempio, ping google.com &
inizierà il ping in background; non sarai in grado di interagire con esso se non digiti fg
.