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

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。我想回到shell。有没有其他选择可以实现我想要的行为?

[更新]

tcshCtrl与+CCtrl+ 的行为相同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

答案1

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

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

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

要将该作业带到前台,请查看fg命令。

答案2

如果那node ...;$bash件事正在进入 pty 输入缓冲区tmux,那么一个可能的解决方案是适当配置终端,trap以仅影响交互式 shell 的方式终止中断,并使用换行符而不是;

stty noflsh; trap : INT

^应该满足前两个要求。

;a和 a之间的差异\n是由于 shell 读取输入的方式造成的 -;分号相当于换行符,因为它分隔命令列表,但不同之处在于它不分隔读取输入。例如:

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$

bashreadline实际上会显示组合键Ctrl+ Vthen Ctrl+的文字换行符J,而不是上面显示的转义符,但效果是相同的:当 shell 本身有效地忽略中断但其子级不忽略时,您可以执行中断线只要终端本身不完全丢弃中断的输入,就可以串行执行 tty 输入。

相关内容