![我怎样才能从外部关闭“less”,而不使我的终端陷入混乱?](https://linux22.com/image/1521953/%E6%88%91%E6%80%8E%E6%A0%B7%E6%89%8D%E8%83%BD%E4%BB%8E%E5%A4%96%E9%83%A8%E5%85%B3%E9%97%AD%E2%80%9Cless%E2%80%9D%EF%BC%8C%E8%80%8C%E4%B8%8D%E4%BD%BF%E6%88%91%E7%9A%84%E7%BB%88%E7%AB%AF%E9%99%B7%E5%85%A5%E6%B7%B7%E4%B9%B1%EF%BC%9F.png)
我正在编写一个实用程序,它会自动less
作为子命令启动并输出。有时在写入输出时会发生错误,我想自动关闭less
并正常显示错误。但是,无论我尝试向进程发送什么信号,它都会忽略它或“不干净地”关闭,即它使我的终端无法使用。(但是,我可以通过按+并(盲目地)写入命令来less
修复终端。)CtrlCstty sane
我尝试了所有“常用”信号:SIGINT
、SIGTERM
和。最后一个显然不起作用,但我还是试了一下。我在 的手册页中找不到有关信号的任何SIGQUIT
信息。SIGKILL
less
可以less
从外面干净地退出吗?
答案1
根据作业控制设置,您可能能够先向程序发出一个kill -tstp
,less
然后发出一个kill -9
。第一个信号被捕获,less
并使其恢复 tty,然后再重新向自身发出信号,这通常会使其在后台暂停。但是,如果 SIGTSTP 的默认处理程序是忽略它,less
则将继续并再次将终端设置为原始。
less
您可以考虑在单独的终端中运行,例如xterm -e sh -c "less /myfile"
,然后您就可以kill -9
无需清除地执行此操作。
您也可以运行less --quit-on-intr
(或-K
),然后它将在 SIGINT 上干净地退出,尽管这也会影响您与输出流的正常交互。
否则,只需将其放在stty sane; tput reset
kill命令后面即可。