コマンドラインでセミコロンで区切られた複数のコマンドを実行しています。
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する方法はありますか?CtrlZ
私は実際に以下のようにtmuxセッションを介してサーバーを実行していますが、+をnode app.js; $bash
実行してサーバーを終了するとbashも終了します。シェルに戻りたいです。私が望む動作を達成するための他のオプションはありますか?CtrlC
【書き直す】
tcsh
Ctrl+CとCtrl+と同じ動作ですZ。 bashがCtrlonlt +と同じように、常にすべてのコマンドに対して機能します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
答え1
bash ジョブ制御を探す必要があります。以下は良い説明です。http://web.mit.edu/gnu/doc/html/features_5.html
しかし、簡単に言うと、+はCtrlコマンドC(すべての行)を終了し、+は実行Ctrl中Zのコマンドをバックグラウンドで実行します。あなたの場合は、バックグラウンドで実行され(出力の抑制と処理の停止)コマンドをcat
実行し続けます。ls
cat
プロセスのリストを確認してこれを確認し、プロセスがまだリストにあることを確認できます。
タスクをフォアグラウンドにインポートするには、fg
コマンドを参照してください。
答え2
もしそうnode ...;$bash
ならプッシュpty入力バッファに入れた場合、考えられる解決策の1つは、対話型シェルにのみ影響するように割り込みを終了するようにtmux
端末を適切に設定し、代わりに改行文字を使用することです。trap
;
stty noflsh; trap : INT
^最初の2つの要件を満たす必要があります。
;
aとaの違いは、シェルが\n
入力を読み取る方法です。;
セミコロンはコマンドリストを区別するという点で改行文字と同じですが、違いは読み取り入力を区別しないことです。たとえば、
prompt$ cat; echo something
this the cat process
this the cat process
^C
prompt$
しかし、ttyドライバを設定したのでいいえ割り込みを受信すると、入力バッファをフラッシュしますstty noflsh
。
prompt$ cat^Jecho something
this is the cat process
this is the cat process
^C
something
prompt$
bash
実際に上記のエスケープ文字の代わりに+ + +readline
キーの組み合わせのリテラル改行を表示しますが、効果は同じです。シェル自体は割り込みを効果的に無視しますが、その子はそうでない場合は割り込みを実行できます。CtrlVCtrlJワイヤー端末自体が中断された入力を完全に破棄しない限り、tty入力は直列に実行できます。