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]
tcsh
verhä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 fg
würde nur zurückbringen cat
und 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
quelle
grep SigIgn /proc/$$/status
das 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.Antworten:
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 derls
Befehl wird dann weiter ausgeführt .Sie können dies bestätigen, indem Sie die Prozessliste überprüfen und feststellen, dass Ihre
cat
noch in der Liste enthalten ist.Um diesen Job in den Vordergrund zu bringen, schauen Sie in den
fg
Befehl.quelle
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?Wenn dieses
node ...;$bash
Ding von in den pty-Eingabepuffer geschoben wirdtmux
, besteht eine mögliche Lösung darin, das Terminal entsprechend zu konfigurieren,trap
Terminal-Interrupts so zu gestalten, dass nur die interaktive Shell betroffen ist, und statt Zeilenumbrüchen zu verwenden;
.^ das sollte die ersten beiden Anforderungen behandeln.
Der Unterschied zwischen a
;
und a\n
ist 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:Aber weil ich den tty-Treiber so konfiguriert habe , dass der Eingabepuffer beim Empfang eines Interrupts nicht geleert wird mit
stty noflsh
:bash
'sreadline
zeigt 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.quelle