web-dev-qa-db-ja.com

Ctrl-Cは行全体を強制終了しますが、Ctrl-Zは強制終了しません

セミコロンで区切ったコマンドラインで複数のコマンドを実行しています。

cmd1; cmd2; cmd3

押すと Ctrl+C 上記では、現在実行されているコマンドだけでなく、すべてのコマンドが強制終了されます。

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

だが Ctrl+Z 現在のプロセスを一時停止し、次のプロセスを続行するだけです。

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$

なぜ行動に分散があるのですか、そしてそれを作る方法はありますか Ctrl+C 次のように動作します Ctrl+Z

私は実際に次のようにtmuxセッションを介してサーバーを実行していますnode app.js; $bash、そして私がするとき Ctrl+C サーバーを強制終了するには、bashも強制終了します。シェルに戻りたいです。私が望む行動を達成するための代替手段はありますか?

[更新]

tcshはと同じように動作します Ctrl+C そして Ctrl+Z。 bashがonltで実行しているのと同じように、常にすべてのコマンドに作用します。 Ctrl+C。ただし、fgを使用してジョブを戻すと、catのみが返され、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]$ 

システムインフォメーション:

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
8
Kartik Anand

Bashジョブコントロールを検索する必要があります。ここにまともな説明があります: http://web.mit.edu/gnu/doc/html/features_5.html

しかし一言で言えば Ctrl+C コマンド(すべての行)を強制終了し、 Ctrl+Z 実行中のコマンドをバックグラウンドで実行します。あなたの場合、それはcatをバックグラウンドで実行し(出力を抑制し、処理を停止します)、その後lsコマンドの実行を続行します。

プロセスリストを確認することでこれを確認でき、catがまだリストに残っていることがわかります。

そのジョブをフォアグラウンドにするには、fgコマンドを調べてください。

6
sysadmiral

そのnode ...;$bashのものがtmuxによってpty入力バッファにプッシュされている場合、考えられる解決策は、ターミナルをtrapターミナルに適切に構成することです。インタラクティブシェルにのみ影響するような方法で割り込み、;ではなく改行を使用します。

stty noflsh; trap : INT

^最初の2つの要件を処理する必要があります。

;\nの違いは、シェルが入力を読み取る方法によるものです。;セミコロンは、コマンドリストを区切るという点で改行と同等ですが、異なる点があります。読み取り入力を区切りません。例えば:

Prompt$ cat; echo something

this the cat process
this the cat process
^C
Prompt$

しかし、私はttyドライバーを構成したのでnotstty noflshで割り込みを受信したときに入力バッファーをフラッシュするように:

Prompt$ cat^Jecho something

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

bashreadlineは、実際にはキーコンボの文字通りの改行を表示します Ctrl+V その後 Ctrl+J 上に示したエスケープではなく、効果は同じです。シェル自体が割り込みを効果的に無視し、その子が無視しない場合、端末自体である限り、割り込みされたtty入力のlinesをシリアルで実行できます。中断された入力を完全に破棄するわけではありません。

0
mikeserv