如何在 shell 脚本中关闭 stdin?

如何在 shell 脚本中关闭 stdin?

我有一个行为不当的程序,需要从脚本中调用它。它一看到 stdin 上有东西就会退出。有没有办法关闭 stdin?

答案1

有没有办法关闭标准输入?

关闭文件描述符

  • n<&-关闭输入文件描述符 n。

  • 0<&-<&-关闭标准输入。

来源第 20 章 I/O 重定向

答案2

找到了,你可以使用以下命令关闭 stdin:

exec 0<&-

答案3

只需通过管道输入一个没有输出的程序:

: | misbehaving_program

答案4

我发现自己也遇到了同样的问题。我的解决方案源自此处的建议,但不同之处在于,不是使用 whichstdin来关闭exec 0<&-,而是允许子 shell 继续使用 stdin。您期望退出但实际上没有退出的示例程序如下所示:

exec 0<&-
$(read stdin)

这是因为read是在继承自父级的子 shell 中生成的stdin。如果我们重定向,stdin我们就会得到预期的行为

exec 0</dev/null
$(read stdin)

这将产生退出代码 1。

相关内容