我在命令行上运行多个命令,使用分号分隔:
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。有没有其他选择可以实现我想要的行为?
[更新]
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
答案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$
bash
的readline
实际上会显示组合键Ctrl+ Vthen Ctrl+的文字换行符J,而不是上面显示的转义符,但效果是相同的:当 shell 本身有效地忽略中断但其子级不忽略时,您可以执行中断线只要终端本身不完全丢弃中断的输入,就可以串行执行 tty 输入。