Ctrl-C 会杀死整行,而 Ctrl-Z 不会

Kar*_*and 8 shell job-control jobs

我在使用分号分隔的命令行上运行多个命令:

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
Run Code Online (Sandbox Code Playgroud)

但是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$
Run Code Online (Sandbox Code Playgroud)

为什么行为存在差异,有没有办法让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]$ 
Run Code Online (Sandbox Code Playgroud)

系统信息:

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
Run Code Online (Sandbox Code Playgroud)

sys*_*ral 6

您需要查找 bash 作业控件。这里有一个不错的解释:http : //web.mit.edu/gnu/doc/html/features_5.html

但简而言之,Ctrl+C将终止命令(所有行),Ctrl+Z将使正在运行的命令成为后台。在您的情况下,它正在后台运行cat(抑制输出并停止处理),然后继续运行该ls命令。

您可以通过检查进程列表来确认这一点,您会发现您cat的仍在列表中。

要将这项工作带到前台,请查看fg命令。