首先让我说,我认为这不是解决您的问题的正确方法。完全没有。必须有一个更好的特定于应用程序的解决方案,你真的应该找到它。
主要问题是,如果不知道要“强制关闭”哪些程序,您将不知道如何使它们“出错”。如果您确实了解这些程序,CodeGnome 的解决方案似乎很好。
另请注意,并非所有程序都直接从 STDIN 读取输入。例如,Python 的 getpass 模块直接打开一个附加文件描述符到/dev/tty
,因此关闭或重定向 STDIN 无关紧要。这也是sudo
接受密码的方式,我相信这也是 ncurses 的工作方式。以这种方式阅读可以让您在不显示在屏幕上的情况下获得密码。
对于不直接从/dev/tty
(例如 bash's )读取的提示,只需从(例如)read
重定向 STDIN可能会让您到达某个地方。或者,您可以做您正在做的事情并关闭 STDIN,但是当程序遇到关闭的 STDIN 或仅包含 EOF 的重定向的 STDIN 时,程序的行为方式是您无法控制的。 希望程序会如您所愿出错,但也许它会继续循环,期待有效的输入。谁知道?/dev/null
./prompt.sh </dev/null
此外,无论是关闭还是重定向都不会是全局的工作方式,如果有的话。某些程序可能会退出,因为您希望关闭 STDIN,其他程序可能需要来自的 EOF/dev/null
因此,执行此操作的方法不是通用的、包罗万象的解决方案,而是针对您放置在该位置的程序量身定制的解决方案。更好的是,不要使用try(运行程序),然后catch (程序要求输入的情况)方法,只需以您知道它们不会要求输入的方式调用程序。
无论如何,话虽如此,一种可能可行的方法是关闭 STDIN 并将进程置于后台。例如:
#!/bin/bash
exec 0<&-
./prompt.sh &
或者,将 STDIN 重定向到 /dev/null 并将进程置于后台。例如:
#!/bin/bash
./prompt.sh </dev/null &
然后,您需要检查程序的返回码(带有$?
)以查看它们是否正确退出。(希望您正在使用的未知程序列表遵循标准返回值方案)
STDIN 的关闭/重定向将处理 STDIN 用于接受输入的情况,而后台进程将处理 is 的情况/dev/tty
(因为后台进程没有 tty)。
如果程序提示您使用其他方法(直接打开一个 FD 到您的伪终端,弹出一个图形输入框,为您提供声音提示等),您就只能靠自己了。