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

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

read: read error: 0: Resource temporarily unavailable

经过一些研究之后,似乎可以通过将那些将bash脚本的STDIN操作到/dev/null的程序的STDIN进行管道传输来找到解决方案。

就像是:
npm install </dev/null

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

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

最佳答案

通常,重要的是要知道被调用程序需要什么输入以及从哪里输入,因此对于那些本来应该没有得到输入的人来说,从/dev/null重定向stdin并不是问题。

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

exec 3<&0 0</dev/null

上面的代码在文件描述符3下复制了stdin文件描述符(0),然后打开/dev/null替换它。

之后,任何试图读取stdin的调用命令都将从/dev/null读取。应当读取原始stdin的程序应具有从文件描述符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/

10-16 16:03