意外的`nano SomeFile | uniq` 使 shell 无响应

意外的`nano SomeFile | uniq` 使 shell 无响应

在我尝试从简单的文本文件中获取唯一条目(读取行)时,我意外地执行了nano SomeTextFile | uniq.

这个“指令”使 shell (bash) 完全(?)无响应/不可用——在 from 中进行了测试药明康索尔。我必须取回进程号(PID)(通过执行ps aux | grep nano)并手动设置sudo kill -9有问题的 PID。

无论如何,上面不能(或不应该?)返回一些错误消息?为什么Ctrl+不C杀死这条管道?有没有比这更简单或更干净的方法来阻止它kill -9

答案1

管道符号将命令的输出发送nano到命令的输入uniq

但是,nano仍在运行并接收您的键盘输入。只是您看不到它的输出,因为uniq在看到文件结尾之前不会输出它的结果(这对问题并不重要)。

当你按下时ctrl-c它会被纳米‘捕获’,但不会导致它退出。

退出nano的方法是按ctrl-x,但是nano如果进行了修改,例如,如果您在输入后按过任何其他键,则不会退出。在这种情况下,nano 将提示您以下内容:

Save modified buffer (ANSWERING "No" WILL DESTROY CHANGES) ?                                                                
 Y Yes
 N No           ^C Cancel

按“n”键将退出而不保存更改。

您可能在意识到自己处于 Nano 状态之前按下了几个组合键,在这种情况下,您可能会深入几个菜单。值得庆幸的是,在 nano 中按下ctrl-x也会从大多数菜单中退出(但不会取消上述提示),这意味着ctrl-x多次按下永远不会让您远离退出。

如果你被一些菜单“困住”,你通常可以通过ctrl-x几次,然后按n键。 如果这不起作用,则意味着您按了ctrl-x太多次 - 只需按ctrl-x 更多的时间,然后是n钥匙——这总是有效的。

答案2

正如其他答案已经解释的那样,Ctrl+C不会杀死 Nano,因为 的输入nano仍然来自终端,并且终端仍然是nano控制终端,因此 Nano 将终端置于原始模式,其中Ctrl+C等控制字符传输到程序并且不被终端拦截以产生信号。

当被终端拦截时,Ctrl+C生成一个信号情报信号。如果您知道进程 ID (可以使用(Linux语法)或其他进程列表实用程序nano找到),则可以发送此信号,其中 12345 是 PID。然而,SIGINT 传统上意味着“返回主循环”,Nano 在收到 SIGINT 时并不退出。相反,发送ps u -C nanopspgrep nanokill -INT 12345信号术语,这意味着“优雅地终止”;这是默认信号,因此您可以运行kill 12345.另一种可能性是kill -HUP 12345叹息意思是“你不再拥有终端,优雅地退出,除非你可以没有终端”。如果所有其他方法均失败,请发送信号杀死kill -KILL 12345,或著名的kill -9 12345),无论程序是否想死,它都会杀死程序。

许多程序,包括 Nano,都识别Ctrl+Z来暂停。这与发送的序列相同信号传输协议信号。如果程序识别出此控制键,您将收到 shell 提示符,并且由于该程序成为后台作业,因此您可以轻松地终止它kill %%(这会向最后放入后台的作业发送信号)。

有了纳米,就有了另一种方式:向其发送退出键序列,即Ctrl+ X,如有必要,后跟N“不保存”。但总的来说,请记住这一点:

  1. 尝试Ctrl+Z后跟kill %%,如果这不会终止程序kill -9 %%
  2. 如果Ctrl+Z不起作用,请切换到另一个终端,找出进程 ID(您可以用来ps -t pts/42列出终端上运行的进程/dev/pts/42)并终止它。

答案3

外壳不会接收你Ctrl+Cnano是的。程序能够定义中断信号的自定义行为,nano就是这样的程序之一。要查看在没有重定向的情况下打开的自定义行为nano并向其发送Ctrl+C.

答案4

打击Ctrl+ X.

Nano 捕获所有键盘输入,Nano Ctrl+内部的C含义与 shell 中完全不同。如果您在单独的窗口中运行nano,您可以轻松查看必须输入哪些键才能退出。Ctrl+X

相关内容