检测/dev/tty 是否可用和功能的跨平台方法

蒂姆·佩里

我有一个 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章