偶然的`nano SomeFile | uniq` 使外壳无响应

Nik*_*ris 5 bash kill freeze nano

在我试图从一个简单的文本文件中获取唯一条目(读取行)时,我不小心执行了nano SomeTextFile | uniq.

这个“指令”使外壳(bash)完全(?)无响应/不可用——在YakuakeKonsole 中进行了测试。我必须检索进程 ID (PID)(通过执行ps aux | grep nano)并手动sudo kill -9获取有问题的 PID。

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

cjh*_*cjh 10

管道符号将 的输出发送nanouniq命令的输入。

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

当您按下ctrl-c它时,nano 会“捕获”它,但不会导致它退出。

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

Save modified buffer (ANSWERING "No" WILL DESTROY CHANGES) ?                                                                
 Y Yes
 N No           ^C Cancel
Run Code Online (Sandbox Code Playgroud)

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

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

如果您“被困”在几个“深”菜单中,您通常可以通过ctrl-x几次然后按n来退出 如果不工作,这意味着你按下ctrl-x一个时间太长many--只需按ctrl-x 一个更多的时间,其次是nkey--这将始终工作。


Gil*_*il' 4

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

\n\n

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

\n\n

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

\n\n

对于 Nano,有一种替代方法:向其发送退出键序列,即Ctrl+X如有必要,后面跟着Nfor \xe2\x80\x9cdon\'t save\xe2\x80\x9d。但总的来说,请记住这一点:

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