Die Strg +Z Die Sequenz wird vom Terminal verarbeitet, nicht von der Shell. (Nützlicher Hintergrund:Was ist der genaue Unterschied zwischen einem 'Terminal', einer 'Shell', einem 'tty' und einer 'Konsole'?)
Nur ein kleiner, nicht erweiterbarer Satz von Funktionen kann an eine Taste in einem Terminal gebunden werden. Sie können die mit diesen Funktionen verknüpften Tasten anpassen, aber keine weitere Funktion hinzufügen. Diese Funktionen fallen in drei Kategorien:
- Kommandozeilen-Edition in Programmen, die keinen eigenen bereitstellen (kanonischer Modus, auch Cooked-Modus genannt (im Gegensatz zum Raw-Modus), den Sie in der Praxis selten verwenden werden):Dateiende (
eof
, Strg +D ), Zeilenende (eol
, Strg +M ), Zeichen links löschen (erase
, Strg +H ), linkes Wort löschen (werase
, Strg +W ), Zeile löschen (kill
, Strg +U ). - Manuelle Flusskontrolle:
stop
(Strg +S ),start
(Strg +Q ). Nur nützlich bei alten seriellen Terminals, die Zeichen verloren haben, wenn das Terminal nicht mit dem Computer mithalten konnte oder umgekehrt. - Signalisierung:Interrupt (
intr
, Strg +C ), Beenden erzwingen (quit
, Strg +\ ), anhalten (Strg +Z ).
Einige Systeme, einschließlich Linux, erweitern diese Liste, aber ich habe noch nie eines gesehen, das Hintergrundinformationen enthielt. Beachten Sie, dass dies sowohl im Terminaltreiber im Kernel als auch im Terminalemulator unterstützt werden würde. Sie müssen sich also mit Suspend begnügen, das dem Vordergrundjob ein SIGTSTP-Signal sendet. Dies löst ein SIGCHLD im übergeordneten Prozess des Leaders des Vordergrundjobs aus, der normalerweise die Shell ist. Wenn die Shell SIGCHLD empfängt, ruft sie waitpid
auf um herauszufinden, warum es benachrichtigt wurde, und wenn erkannt wird, dass ein Hintergrundjob ausgesetzt wurde, zeigt es eine Benachrichtigung an (z. B. [1] + 12345 suspended mycommand
) und eine neue Eingabeaufforderung.
Sie könnten die Shell so programmieren, dass sie einen SIGCONT
sendet Signal an den Vordergrundjob. Ich glaube nicht, dass zsh dafür einen Haken hat, Sie müssten den Quellcode patchen. Und es gibt für zsh keine Möglichkeit zu wissen, ob Sie das Programm wirklich unterbrechen wollten (oops, dieses Programm macht möglicherweise das Falsche, lassen Sie es mich anhalten, während ich es regele) oder es in den Hintergrund versetzen.
Was ich tue, ist, die Ctrl einzustellen +Z Tastenfolge in zsh, um den aktuellen Job in den Hintergrund zu schalten (%%
). Auf diese Weise kann ich den Vordergrundjob in den Hintergrund schicken, indem ich Strg drücke +Z Strg +Z . Wo ich gerade dabei bin, mache ich Ctrl +Z etwas anderes Nützliches tun, wenn die aktuelle Eingabezeile nicht leer ist (ich bin also nicht gerade von einem Unterprozess zurückgekommen):die aktuelle Eingabezeile „anhalten“, damit ich einen weiteren Befehl eingeben kann, wonach die unterbrochene Zeile wieder eingefügt wird den Eingabepuffer.
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 wie zsh oben ist in Bash möglich, obwohl es ein bisschen klobig ist und ich es nicht lange ausgeführt habe:
- Fügen Sie in Ihrer .inputrc die Zuordnung
"\C-z": "bg\n"
ein - Fügen Sie in die PS0-Bash-Variable `$(stty susp ^z)' ein
- In die Bash-Variable PROMPT_COMMAND fügen Sie 'stty susp ^@' ein
^z für Suspend wird also eingeschaltet, wenn ein Befehl ausgeführt wird, und dann für die Bash-Eingabeaufforderung ausgeschaltet.