Wie kann ich Strg-Z und BG mit einem Tastendruck ausführen, um den Vorgang im Hintergrund fortzusetzen?

25

Ich folge dem Muster, die Aufgabe auszusetzen und sie dann zu oft mit der Ctrl-Z bgSequenz fortfahren zu lassen .

Ich habe mich gefragt, ob es eine Möglichkeit gibt, das auf einen einzigen Tastendruck zu komprimieren.

Meine Muschel ist zsh

Evgeniy Dolzhenko
quelle
Ich möchte sagen, dass das wahrscheinlich hart codiert ist. Aber ich bin nicht 100%
Chad Harrison
Sicher , es ist, aber ich habe die elegante Lösung gefunden, danke superuser.com/a/161922/35223
Evgeniy Dolzhenko

Antworten:

24

Die Ctrl+ Z-Sequenz wird vom Terminal und nicht von der Shell verarbeitet. (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 einen Schlüssel in einem Terminal gebunden werden . Sie können die an diese Funktionen gebundenen Tasten anpassen, aber keine weitere Funktion hinzufügen. Diese Funktionen lassen sich in drei Kategorien einteilen:

  • Befehlszeilen-Edition in Programmen, die keine eigenen Programme bereitstellen (kanonischer Modus, auch Gekochter Modus genannt (im Gegensatz zum Raw-Modus), den Sie in der Praxis selten verwenden): Dateiende ( eof, Ctrl+ D), Zeilenende ( eol, Ctrl+ M), Zeichen links löschen ( erase, Ctrl+ H), Wort links löschen ( werase, Ctrl+ W), Zeile löschen ( kill, Ctrl+ U).
  • Manuelle Flusskontrolle: stop( Ctrl+ S), start( Ctrl+ Q). Nur nützlich bei alten seriellen Terminals, bei denen Zeichen verloren gingen, wenn das Terminal nicht mit dem Computer mithalten konnte oder umgekehrt.
  • Signalisierung: Interrupt ( intr, Ctrl+ C), Force Quit ( quit, Ctrl+ \), Suspend ( Ctrl+ Z).

Einige Systeme, einschließlich Linux, erweitern diese Liste, aber ich habe noch nie ein System mit Hintergrundinformationen gesehen. Beachten Sie, dass dies sowohl den Terminal-Treiber im Kernel als auch den Terminal-Emulator unterstützt. Sie müssen sich also mit suspend begnügen, das dem Vordergrundjob ein SIGTSTP- Signal sendet . Dies löst eine SIGCHLD im übergeordneten Prozess des Leaders des Vordergrundjobs aus, bei dem es sich normalerweise um die Shell handelt. Wenn die Shell SIGCHLD empfängt, ruft sie waitpidauf, um herauszufinden, warum sie benachrichtigt wurde, und zeigt bei Feststellung, dass ein Hintergrundjob angehalten wurde, eine Benachrichtigung (z. B. [1] + 12345 suspended mycommand) und eine neue Eingabeaufforderung an.

Sie können die Shell so programmieren, dass ein SIGCONTSignal an den Vordergrundjob gesendet wird. Ich glaube nicht, dass zsh einen Haken dafür hat, Sie müssten den Quellcode patchen. Und zsh kann nicht wissen, ob Sie das Programm wirklich unterbrechen wollten (hoppla, dieses Programm macht möglicherweise das Falsche, lass es mich anhalten, während ich es aussortiere) oder es im Hintergrund anzeigen.


Ich setze die Ctrl+ Z-Tastenfolge in zsh auf den Hintergrund des aktuellen Jobs ( %%). Auf diese Weise kann ich den Vordergrundjob durch Drücken von Ctrl+ Z Ctrl+ in den Hintergrund verschieben Z. Wenn die aktuelle Eingabezeile nicht leer ist (ich bin also nicht gerade von einem Unterprozess zurückgekehrt), lasse ich Ctrl+ Znoch etwas Nützliches tun: Hänge die aktuelle Eingabezeile an und erlaube mir, einen anderen Befehl einzugeben Danach wird die unterbrochene Leitung in den Eingangspuffer zurückgeschoben.

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
Gilles 'SO - hör auf böse zu sein'
quelle
Gilles, das ist eine unglaublich vollständige, lehrreiche und nachdenkliche Antwort, die ich nicht erwarten konnte! Ich danke dir sehr!
Evgeniy Dolzhenko
2

^ z ^ z wie zsh oben ist in bash möglich, obwohl es ein bisschen kludgy ist und ich habe das nicht lange ausgeführt:

  • Fügen Sie in Ihre .inputrc das Mapping ein "\C-z": "bg\n"
  • In der PS0-Bash-Variable enthalten "$ (stty susp ^ z)"
  • In der PROMPT_COMMAND-Bash-Variable ist 'stty susp ^ @' enthalten.

So wird ^ z for suspend aktiviert, wenn ein Befehl ausgeführt wird, und dann für die Bash-Eingabeaufforderung deaktiviert.

JohnLittle
quelle
1

Also fand die Lösung nicht genau das, was ich will, aber verdammt knapp von hier /superuser//a/161922/35223

Auf einer leeren Befehlszeile wird bg ausgeführt (so dass Strg + Z Strg + Z ein Programm anhält und es sofort im Hintergrund fortsetzt).

Evgeniy Dolzhenko
quelle
Ich werde bemerken, dass dies zsh erfordert; es wird in bash nicht unterstützt. (aus dem Kasten heraus irgendwie)
Kevin M
@ KevinM Sie können eine analoge Funktion in Bash schreiben (zumindest die Basisversion, die einen Ctrl+ZAufruf ausführt bg, ich bin mir nicht sicher, ob eine nicht leere Eingabezeile erkannt wird).
Gilles 'SO - hör auf böse zu sein'
0

Wollten Sie diese Befehle zunächst im Vordergrund ausführen und dann in den Hintergrund wechseln? Ich weiß nicht, ob es einen einfacheren Weg gibt. Wenn Sie jedoch Befehle ausführen möchten, die zunächst im Hintergrund ausgeführt werden, können Sie am Ende der Zeile ein kaufmännisches Und hinzufügen. ping google.com &Fängt zB an, im Hintergrund zu pingen; Sie können nicht damit interagieren, es sei denn, Sie geben ein fg.

oktern
quelle
1
Vielen Dank, das Problem ist, dass Sie manchmal keine Vorstellung davon haben, wie viel Zeit die Ausführung des Befehls in Anspruch nehmen würde. Sie werden also interaktiv ausgeführt und stellen dann fest, dass Sie es besser im Hintergrund fortsetzen lassen. Die akzeptierte Antwort wirkt Wunder für mich und verwendet sie täglich!
Evgeniy Dolzhenko
Danke für die Antwort. Die akzeptierte Antwort ist ziemlich ordentlich!
1.