Bash 中延迟暂停 (Ctrl-Y) 的目的是什么?

Bash 中延迟暂停 (Ctrl-Y) 的目的是什么?

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 的几十年里从来没有真正使用过这个。

相关内容