セミコロンで区切ったコマンドラインで複数のコマンドを実行しています。
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
Bashジョブコントロールを検索する必要があります。ここにまともな説明があります: http://web.mit.edu/gnu/doc/html/features_5.html
しかし一言で言えば Ctrl+C コマンド(すべての行)を強制終了し、 Ctrl+Z 実行中のコマンドをバックグラウンドで実行します。あなたの場合、それはcat
をバックグラウンドで実行し(出力を抑制し、処理を停止します)、その後ls
コマンドの実行を続行します。
プロセスリストを確認することでこれを確認でき、cat
がまだリストに残っていることがわかります。
そのジョブをフォアグラウンドにするには、fg
コマンドを調べてください。
その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$
bash
のreadline
は、実際にはキーコンボの文字通りの改行を表示します Ctrl+V その後 Ctrl+J 上に示したエスケープではなく、効果は同じです。シェル自体が割り込みを効果的に無視し、その子が無視しない場合、端末自体である限り、割り込みされたtty入力のlinesをシリアルで実行できます。中断された入力を完全に破棄するわけではありません。