Bash中延迟挂起(Ctrl-Y)的目的是什么?


30

Bash手册页的整个部分仅适用于:

如果运行bash的操作系统支持作业控制,则bash包含使用它的工具。在进程运行时键入暂停字符(通常为^ Z,Control-Z)将导致该进程停止并将控制权返回给bash。 键入延迟的挂起字符(通常为^ Y,Control-Y)会导致该进程在尝试从终端读取输入时停止,并将控件返回到bash。 然后,用户可以使用bg 命令在后台继续执行该作业的状态,fg命令在前台继续执行,或使用kill命令将其删除。^ Z立即生效,并具有额外的副作用,导致丢弃待处理的输出和提前输入。

我从未用过Ctrl- Y; 我只是了解而已。我只用Ctrl- Z(暂停)就可以了。

我试图想象此选项的用途。什么时候有用?

(请注意,并非所有Unix变体都具有此功能。SolarisFreeBSD上存在此功能,而Linux上不存在。相应的设置为stty dsusp。)

也许少主观:有没有什么可以完成Ctrl- Y不能用很容易实现的Ctrl- Z


@Gilles,尽管FreeBSD似乎有一个stty dsusp,但我没有设法使它在^ Y时发送SIGTSTP(我在Solaris上也是如此)。有吗
斯特凡Chazelas

Answers:


23

csh4BSD手册中

A ^Z会立即生效,就像中断一样,键入时,待处理的输出和未读的输入将被丢弃。还有另一个特殊键^Y,直到程序尝试读取(2)该信号之前,它不会生成STOP信号。当您为作业准备了一些希望在读取它们后停止的命令时,可以在前面键入有用的信息。

因此,目的是在处理第一个输入时键入多个输入,并在完成输入后使作业停止。


该描述与bash手册有细微的差别。 “......不产生停止信号,直到程序试图读取它。 这听起来像在输入流都达到^Y将被读取成功,并且随后当^Y被打的过程将被停止。我读对了吗?
通配符

@Wildcard在我的Mac OS X上的测试,这个过程读取之前停止()返回(但通话结束后阅读()即返回在Y运行),并重新开始后,来自^在y之前接收输入。我认为,由于原本打算使用它,所以将在行的开头使用它,因此在这种情况下的行为无关紧要。我怀疑在实际代码中,当将^ Y复制到用户进程读取缓冲区中时,它将被挂起。
Random832 '16

我是对的,在原始的BSD内核的ttread函数中,您可以看到此代码,以及现代的OSX
Random832 '16

但是,当恢复该过程时,该调用将成功,并且将包含您之前在终端中键入的数据^Y,即使您已放弃该过程并在恢复该过程之前关闭了终端。对?(“ ...恢复后,它从^ Y之前接收输入。” 这就是我的意思;我通常不使用C代码。):)
通配符

是。而且它返回的末尾没有换行符,这对于规范模式下的读取是不寻常的(类似于您键入一些文本然后按一次^ D的情况),我怀疑他们没有考虑这种情况,因为它实际上是打算在一行的开头键入的。
Random832 '16

11

假设有一个循环读取输入并执行。让任务完成它正在计算的当前指令,而在返回到新指令之前,不中断它可能会很有用。这样就结束了一个周期。如果read处于超时限制下,这将优雅地结束循环并阻止其再次运行。


但是,如果它要试图从终端读取输入无论如何,它将停止在这一点上(并等待您的输入),你可以^Z然后
通配符

是。查看更新。
Tomasz

再检查一次。@Wildcard
Tomasz

1
但是,如果有超时,如果您没有做任何特别的事情,难道不是还会优雅地结束吗?
丹尼尔·瓦格纳

1
它可能。但是它可能还会继续执行一些默认工作。
Tomasz

4

我可以想到一种可能有用的方案,但这是人为的边缘情况。

假设您正在调试一个脚本,该脚本正在编写要分析的临时文件,然后将其作为清理例程的一部分进行删除。

您可以read foo在写入文件后(但在清除之前)在某个位置添加一个位置,运行脚本,然后按Ctrl- Y在生成文件时。然后,您将被挂起,并在后台挂起了脚本,以执行所需的操作,然后fg可以让脚本完成。


1
似乎不太可能,因为脚本仍然会等待输入。因此,您可以轻松地观察它,以提示您输入内容,然后使用挂起它^Z。换句话说:键入后,无论如何fg都要给脚本一些输入然后脚本才能继续。因此,我的问题是:我仍然看不到重点^Y。(不过,感谢您的回答!):)
通配符

2

我能想到的唯一方案(甚至我都不认为这很有说服力)是,如果您想对shell命令使用某种预输入方式。假设正在运行某些命令,该命令将在将来的某个时间读取输入。然后您可以对其进行^ Y,然后在运行命令挂起时立即键入要执行的下一个Shell命令。我认为在使用BSD Unix的几十年中,我从未真正使用过它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.