我有一个 bash 脚本,我想从中访问 /dev/tty,但只有在它可用时。
当它不可用时(在我的情况下:在 GitHub Actions 中运行我的脚本时)然后当我尝试访问它时,我会得到/dev/tty: No such device or address
,并且我试图提前检测它以避免错误并提供回退行为。
为此,我需要一个 bash 测试,它可以清楚地检测到这种情况,并且可以跨平台可靠地工作(即不使用在 Mactty
上有问题的命令)。
我目前正在使用[[ -e "/dev/tty" ]]
哪个不起作用 - 即使在 GitHub Actions 上它似乎也返回 true,似乎 /dev/tty 存在但访问它会失败。我应该用什么代替?
在测试了许多有希望但并不完美的建议(请参阅其他答案)之后,我想我已经找到了完全符合我的需求的自己的解决方案:
if bash -c ": >/dev/tty" >/dev/null 2>/dev/null; then
# /dev/tty is available and usable
else
# /dev/tty is not available
fi
解释:
: >/dev/tty
什么都不做(使用:
内置的bash)并将什么都输出到 /dev/tty,从而检查它是否存在并且它是可写的,但实际上并没有产生任何可见的输出。如果这成功了,我们就很好。
如果我们在没有 /dev/tty 的顶层这样做,bash 本身会在我们的输出中产生一个嘈杂的错误,抱怨 /dev/tty 不可用。这无法重定向和静音,因为它来自 bash 本身,而不是 printf 命令。
包装它bash -c "..." >/dev/null 2>/dev/null
在 bash 子shell中运行测试,删除 stdout/stderr,因此在仍然返回整体退出代码的同时消除所有错误和警告。
欢迎提出进一步改进的建议。作为参考,我正在使用 进行测试setsid <command>
,这似乎是对我遇到问题的无 TTY 环境的一个很好的模拟。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句