对于UNIX / Mac OS X终端,^ C和^ D有什么区别?


61

当我尝试停止某事时,我^C有时会^D在终端中使用。

两者有什么区别?为什么有些程序没有响应^C,但是^D。为什么在我使用Terminal.app时退出^D


仅供参考:请参阅Wikipedia页面上的内容:Control + C产生的文本结尾字符U + 0003,以及 Control + D产生的传输结束字符U + 0004。
罗勒·布尔克

Answers:



62

Ctrl+ D^D)表示文件结尾。它仅在一行的开头起作用(我简化了一点),并且如果程序没有从终端读取输入,则它无效。在实验中,^D告诉外壳程序您将不再键入任何命令,因此退出了该命令。然后终端退出,因为其子程序已终止。

Ctrl+ C^C)表示“中断”,即停止正在执行的操作。从技术上讲,按下会^C发送INT信号,默认情况下会终止应用程序,但是在许多程序中,这意味着返回顶层(例如,在shell中,停止键入命令行并返回原始提示)。

如果程序没有响应^C,则可以尝试Ctrl+ \^\)。这会发送QUIT信号,默认情况下会终止应用程序,并且不会有太多程序拦截。

发送信号的另一个键是Ctrl+ Z^Z)。它发送TSTP信号,从而暂停在前台运行的程序。(TSTP是“终端停止”的缩写;它与STOP类似,但可以忽略TSTP,而STOP则不能忽略。)在Shell中,您可以使用fg命令(在前台恢复)或bg命令(在后台恢复)来恢复程序的执行。背景)。

所有这些键都可以使用stty命令进行更改。某些程序,尤其是具有按键绑定的全屏程序会禁用它们。


一个小修正:Control-Z发送TSTP(终端停止)信号。这可以被进程捕获或忽略,而STOP信号则不能。
克里斯·佩奇

需要这个!它被卡住了,我无法离开
ahnbizcad 2015年

1
只是有关CTRL-D的建议:意思是“刷新到目前为止我输入的输入”,如果该行为空,则read()返回零,并将其解释为“文件末尾”。
luca

这是非常重要和有用的信息;感谢您提供全面而清晰的解释
iono

只是好奇,为什么在shell中运行的python progam没有用ctrl + c退出,而是提示KeyboardInterrupt?它的确以ctrl + d(如果在行的开头)和ctrl + \退出。
瑞克

2

加上上面的2个非常好的答案,这是一个示例:

如果输入python外壳程序,它将带您进入python >>>提示符。

现在,如果您点击Ctrl+C,它会说KeyboardInterrupt并留在>>>中。
如果你进入一个for循环,例如,通过键入for x in (text):它等待你通过显示...提示类型进一步,如果你打到Ctrl+C现在,它会从退出的声明,并返回>>>提示
如果你打Ctrl+D在任何时候,无论是>>>还是...,它都将退出python提示符并返回原始shell。

同样,如果将ssh放入另一台计算机,则a Ctrl+C将终止所有现有命令,Ctrl+D并将其退出该计算机。(此外,Delete键与执行操作相同Ctrl+D


我很欣赏这个答案。但是,当我自己尝试时发现一些错误。在ssh进入远程计算机并运行python进程时,Ctrl + D退出python并带我回到远程计算机的提示符,但它没有从计算机退出。另外,无论在远程提示符下还是在本地提示符下运行python,Delete键在任何情况下都不能与Ctrl + D相同。它似乎什么也没做,只是在键入python时实际上删除了字符。但是,Ctrl + D确实在键入时充当Delete键,它删除了字符。
堆栈下溢

1
很有意思,我认为这可能取决于您所使用的shell种类(bash,ksh等)。
Siddhartha
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.