CTRL + C不正确地用于返回命令行吗?


27

在使用tail -f并且想返回外壳时,我总是使用CTRL+C。或者,当我键入命令并想中止它并重新开始时,我只是CTRL+C回到一个空的命令行提示符。这被认为是不良做法吗?我有时会觉得有一种更好的方法可以脱离某些事物,但是真的不知道。


6
要取消部分输入的shell命令,可以使用Control-U或Delete(取决于tty设置和键绑定),但是使用Control-C并没有错。
基思·汤普森

@KeithThompson感谢您的Ctrl + U,我当时不知道那一个:-)
Patrick

作为记录,Cu实际上并没有取消输入的命令,而是将其移动到粘贴缓冲区中(类似于某些程序的“剪切”功能)。
克里斯·

Answers:


36

Ctrl+ C将SIGINT发送到程序。这告诉程序您要中断(并结束)它的进程。大多数程序正确地抓住了这一点并干净地退出。因此,是的,这是结束大多数程序的“正确”方法。

还有其他键盘快捷键可用于向程序发送其他信号,但这是最常见的。


9
也有Ctrl + D用于读取用户输入的程序。Ctrl + D关闭STDIN到程序。为了正常退出shell,它也可用(与键入exit完全相同)。
Patrick

2
@Patrick Ctrl + D实际上将“文件结束”指示符发送到流。由程序适当地响应(通常是关闭文件流)。
克里斯·S

那就是关闭STDIN的作用。如果不关闭管道/流,则无法获得EOF。
帕特里克

9
帕特里克在三点上错了。首先:Control + D对管道没有此含义。第二:EOF特殊字符不会关闭任何内容。它会导致从当前系统调用一次返回零字节(假定行缓冲区为空)read()。下一个read()不受影响。第三:这都不适用于将行规则置于非规范模式的程序,例如过去几十年中的大多数shell程序,以及使用GNU之类库的其他程序readline
JdeBP 2012年


11

要在键入时中止长命令,有时我会跳到行首,并在输入Enter之前插入一个注释符号:

Home#Enter

Pos1#Return

例如,如果我键入了一个长路径的复制命令,并且同时观察到,我首先需要创建目录,但随后要重复该命令,这将非常有用。然后,我只需要从历史记录中获取它,删除哈希,然后输入即可。

在Bash中,您可以使用快捷方式

Alt+#

注释中指出的,以重新标记您的命令(谢谢@Zorawar)。


6
您也可以在Ctrl-A不用离开首页的情况下使用。
Dietrich Epp 2012年

1
而且Ctrl-E去年底,顺便说一句。
戴夫

@Dave:是的,但是您无需移动到最后按Enter键即可确认命令。命令行不是编辑器,可能会在其中插入换行符。
用户未知

2
在bash中,您只需按一下即可实现相同的操作Alt-#:它将放入注释并运行命令(因此将其放入历史记录中)。
Zorawar 2015年

8

一般来说,当程序没有交互方式终止时(设计使然,或者更频繁地因为它已冻结或变得不可用),使用Ctrl+ C就可以了。请记住,在交互模式下,您真正​​想要的键组合可能是Ctrl+ D,它会发送一个EOF,表示输入结束。


1

如果使用Bash,也可以使用Ctrl- Z,然后键入bg以“将当前作业放入后台”。


0

正如@Patrick在对已接受答案的评论中所说,

也有一些Ctrl+D程序正在读取用户的输入。Ctrl+D关闭STDIN到程序。

Ctrl+C在使用后无法恢复命令行时帮助了我>>

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.