![Bash 中延迟暂停 (Ctrl-Y) 的目的是什么?](https://linux22.com/image/92437/Bash%20%E4%B8%AD%E5%BB%B6%E8%BF%9F%E6%9A%82%E5%81%9C%20(Ctrl-Y)%20%E7%9A%84%E7%9B%AE%E7%9A%84%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
Bash 手册页中适用的完整部分仅说明:
如果运行 bash 的操作系统支持作业控制,bash 则包含使用它的工具。在进程运行时键入暂停字符(通常是 ^Z、Control-Z)会导致该进程停止并将控制权返回给 bash。 键入延迟挂起字符(通常为 ^Y、Control-Y)会导致进程在尝试从终端读取输入时停止,并将控制权返回给 bash。 然后,用户可以操纵该作业的状态,使用
bg
在后台继续它的命令、fg
在前台继续它的命令或杀死它的kill命令。 ^Z 立即生效,并具有导致挂起的输出和 typeahead 被丢弃的额外副作用。
我从来没有用过Ctrl- Y;我才刚刚了解到这件事。我只用Ctrl- Z(暂停)就做得很好。
我试图想象这个选项是什么为了。什么时候会有用呢?
(请注意,此功能并不存在于所有 Unix 变体上。它存在于索拉里斯和 OpenBSD,但不适用于 Linux 或 FreeBSD。对应的设置是stty dsusp
。)
也许不那么主观:是否有任何事情可以用Ctrl-来完成,而用-Y则不能轻易完成?CtrlZ
答案1
来自4BSD csh 手册:
A
^Z
立即生效,就像一个中断,在键入时,挂起的输出和未读的输入将被丢弃。还有另一个特殊键^Y
,在程序尝试停止之前不会生成停止信号读(2)它。当您为某个作业准备了一些命令,而您希望在它读取这些命令后停止这些命令时,可以提前键入此命令。
因此,目的是在处理第一个输入时键入多个输入,并在完成后停止作业。
答案2
假设有一个循环读取输入并执行。让任务完成它计算的当前指令,而不在它返回到命令行执行新指令之前中断它可能会很有用。这样就结束了一个循环。这会优雅地结束循环,并防止它read
在超时限制下再次运行。
答案3
我可以想到一种可能有用的场景,但它是一种人为的边缘情况。
假设您正在调试一个正在写入临时文件的脚本,您希望在将这些文件作为清理例程的一部分删除之前对其进行分析。
您可以read foo
在写入文件之后(但在清理之前)添加一个,运行脚本,然后在生成文件时按Ctrl- 。Y然后,您将看到一个提示,脚本暂停在后台,以执行您需要执行的任何操作,然后可以fg
允许脚本完成。
答案4
我能想到的唯一场景(甚至我觉得它不是很有说服力),是如果你想对 shell 命令使用一些预先输入。假设某个命令正在运行,它将在将来的某个时间读取输入。然后您可以 ^Y 它,然后立即键入您想要在运行命令挂起时执行的下一个 shell 命令。我想我在使用 BSD Unix 的几十年里从来没有真正使用过这个。