Strg-C beendet die gesamte Zeile, Strg-Z nicht

8

Ich führe mehrere Befehle in der Befehlszeile aus, die durch Semikolons getrennt sind:

cmd1; cmd2; cmd3

Wenn ich oben Ctrl+ drücke C, werden alle Befehle beendet, anstatt nur der, der gerade ausgeführt wird.

kartik@kartikpc:~/junk/exp$ ls
test1  test2
kartik@kartikpc:~/junk/exp$ cat; ls
cat is running
cat is running
^C
kartik@kartikpc:~/junk/exp

Aber Ctrl+ Zwürde nur den aktuellen Prozess unterbrechen und mit dem nächsten fortfahren.

kartik@kartikpc:~/junk/exp$ ls
test1  test2
kartik@kartikpc:~/junk/exp$ cat; ls
cat is running 
cat is running
^Z
[1]+  Stopped                 cat
test1  test2
kartik@kartikpc:~/junk/exp$

Warum gibt es eine Unstimmigkeit im Verhalten und gibt es eine Möglichkeit, Ctrl+ dazu zu bringen, Csich wie Ctrl+ zu verhalten Z?

Ich führe einen Server tatsächlich wie folgt über eine tmux-Sitzung aus node app.js; $bash, und wenn ich ein Ctrl+ mache C, um den Server zu beenden , wird auch Bash beendet. Ich möchte zur Shell zurückkehren. Gibt es eine Alternative, um das gewünschte Verhalten zu erreichen?

[AKTUALISIEREN]

tcshverhält sich mit Ctrl+ Cund Ctrl+ gleich Z. Es würde immer auf alle Befehle wirken, genau wie Bash mit onlt Ctrl+ C. Aber den Job mit zurückzubringen fgwürde nur zurückbringen catund nicht ls.

[kartika@vm-kartika-vnc ~/junk]$ ls
file1  file2
[kartika@vm-kartika-vnc ~/junk]$ echo $SHELL
/bin/tcsh
[kartika@vm-kartika-vnc ~/junk]$ cat; ls
cat is running 
cat is running
^C
[kartika@vm-kartika-vnc ~/junk]$ cat ; ls
cat is running
cat is running
^Z
Suspended
[kartika@vm-kartika-vnc ~/junk]$ jobs
[1]  + Suspended                     cat
[kartika@vm-kartika-vnc ~/junk]$ fg
cat                                     // Pressing ctrl-d here to exit cat
[kartika@vm-kartika-vnc ~/junk]$ 

System Information:

kartik@kartikpc:~/junk/exp$ uname -a
Linux kartikpc 3.13.0-70-generic #113-Ubuntu SMP Mon Nov 16 18:34:13 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
kartik@kartikpc:~/junk/exp$ echo $SHELL
/bin/bash
Kartik Anand
quelle
Ist grep SigIgn /proc/$$/statusdas 4-Bit in der niedrigsten Position eingeschaltet? Das ist oft der Fall. Anschließend können Sie Control-backslash eingeben, um ein SIGQUIT zu senden, um den Vordergrundjob zu beenden, ohne dass die Shell den Rest der Befehlszeile verwirft. Abhängig von Ihrer Konfiguration kann es jedoch zu einem Core-Dump des Vordergrundjobs kommen.
Mark Plotnick

Antworten:

6

Sie müssen die Bash-Job-Steuerelemente nachschlagen. Hier gibt es eine anständige Erklärung: http://web.mit.edu/gnu/doc/html/features_5.html

Kurz gesagt, Ctrl+ beendet Cdie Befehle (die gesamte Zeile) und Ctrl+ Zführt den Hintergrund des laufenden Befehls aus. In Ihrem Fall wird ein Hintergrund erstellt cat(unterdrückt die Ausgabe und hält die Verarbeitung an) und der lsBefehl wird dann weiter ausgeführt .

Sie können dies bestätigen, indem Sie die Prozessliste überprüfen und feststellen, dass Ihre catnoch in der Liste enthalten ist.

Um diesen Job in den Vordergrund zu bringen, schauen Sie in den fgBefehl.

Sysadmiral
quelle
Ich führe einen Server über tmux wie folgt aus node app.js; $bash, und wenn ich eine Strg-C-Taste mache, um den Server zu beenden, wird auch Bash beendet. Ich möchte zur Shell zurückkehren. Gibt es eine Alternative, um das gewünschte Verhalten zu erreichen?
Kartik Anand
0

Wenn dieses node ...;$bashDing von in den pty-Eingabepuffer geschoben wird tmux, besteht eine mögliche Lösung darin, das Terminal entsprechend zu konfigurieren, trapTerminal-Interrupts so zu gestalten, dass nur die interaktive Shell betroffen ist, und statt Zeilenumbrüchen zu verwenden ;.

stty noflsh; trap : INT

^ das sollte die ersten beiden Anforderungen behandeln.

Der Unterschied zwischen a ;und a \nist auf die Art und Weise zurückzuführen, wie Shells die ;Leseeingabe lesen. Ein Semikolon entspricht einer neuen Zeile darin, dass es Befehlslisten abgrenzt, unterscheidet sich jedoch darin, dass es die Leseeingabe nicht abgrenzt. Zum Beispiel:

prompt$ cat; echo something

this the cat process
this the cat process
^C
prompt$

Aber weil ich den tty-Treiber so konfiguriert habe , dass der Eingabepuffer beim Empfang eines Interrupts nicht geleert wird mit stty noflsh:

prompt$ cat^Jecho something

this is the cat process
this is the cat process
^C
something
prompt$

bash's readlinezeigt tatsächlich eine wörtliche neue Zeile für die Tastenkombination Ctrl+ Vdann Ctrl+ Janstelle des oben gezeigten Escape an, aber der Effekt ist der gleiche: Wenn die Shell selbst Interrupts effektiv ignoriert, ihre Kinder jedoch nicht, können Sie unterbrochene Zeilen von tty ausführen Eingabe in serieller Form, solange das Terminal selbst die unterbrochene Eingabe nicht vollständig verwirft.

mikeserv
quelle