gpt4 book ai didi

Bash shell 读取错误 : 0: Resource temporarily unavailable

转载 作者:行者123 更新时间:2023-11-29 08:52:40 29 4
gpt4 key购买 nike

编写 bash 脚本时。有时您运行的命令会打开另一个程序,例如 npm、composer 等。但同时您需要使用 read 来提示用户。

你不可避免地会遇到这种错误:

read: read error: 0: Resource temporarily unavailable

在做了一些研究之后,似乎有一个解决方案,通过将那些操纵 bash 脚本的 STDIN 的程序的 STDIN 管道传输到/dev/null。

类似于:

npm install </dev/null

其他研究表明,它与以下事实有关:STDIN 被设置为某种阻塞/非阻塞状态,并且在程序完成后未被重置。

问题是有某种万无一失的优雅方式来读取用户提示输入,而不会受到那些操纵 STDIN 的程序的影响,也不必寻找哪些程序需要将其 STDIN 重定向到/dev/null。您甚至可能需要使用这些程序的 STDIN!

最佳答案

通常重要的是要知道被调用的程序期望什么输入以及从哪里输入,所以对于那些不应该得到任何输入的人来说,从/dev/null 重定向 stdin 不是问题。

仍然可以对 shell 本身和所有调用的程序执行此操作。只需将 stdin 移动到另一个文件描述符并在其位置打开/dev/null 即可。像这样:

exec 3<&0 0</dev/null

上面复制了文件描述符 3 下的标准输入文件描述符 (0),然后打开/dev/null 替换它。

在此之后,任何试图读取 stdin 的调用命令都将从/dev/null 读取。应该读取原始标准输入的程序应该从文件描述符 3 进行重定向。像这样:

read -r var 0<&3

<重定向运算符假设目标文件描述符为 0,如果它被省略,所以上面的两个命令可以这样写:

exec 3<&0 </dev/null
read -r var <&3

关于Bash shell 读取错误 : 0: Resource temporarily unavailable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19895185/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com