Tim*_*rry 7 linux macos bash shell tty
我有一个 bash 脚本,我想从中访问 /dev/tty,但前提是它可用。
当它不可用时(在我的例子中:在 GitHub Actions 中运行我的脚本时),当我尝试访问它时,我会得到/dev/tty: No such device or address,并且我会尝试提前检测到这一点以避免错误并提供后备行为。
为此,我需要一个 bash 测试来清楚地检测这种情况,并且可以跨平台可靠地工作(即不使用该命令,该命令在 Mac 上tty有问题)。
我目前正在使用[[ -e "/dev/tty" ]]它不起作用 - 即使在 GitHub Actions 上它似乎也会返回 true,其中似乎 /dev/tty 存在但访问它会失败。我应该用什么来代替?
在测试了很多有希望但不太完美的建议(请参阅其他答案)之后,我想我已经找到了完全符合我的需求的自己的解决方案:
if sh -c ": >/dev/tty" >/dev/null 2>/dev/null; then
# /dev/tty is available and usable
else
# /dev/tty is not available
fi
Run Code Online (Sandbox Code Playgroud)
解释:
: >/dev/tty不执行任何操作(使用:内置的 bash)并向 /dev/tty 输出任何内容,从而检查它是否存在且可写,但实际上不产生任何可见的输出。如果成功的话,我们就很好了。
如果我们在没有 /dev/tty 的情况下在顶层执行此操作,bash 本身会在输出中产生一个嘈杂的错误,抱怨 /dev/tty 无法使用。这不能被重定向和静音,因为它来自 bash 本身,而不是:命令。
将其包装sh -c "..." >/dev/null 2>/dev/null在 bash 子 shell 中运行测试,并删除 stdout/stderr,从而消除所有错误和警告,同时仍返回整体退出代码。
欢迎提出进一步改进的建议。作为参考,我正在使用 进行测试setsid <command>,这似乎是对我遇到问题的无 TTY 环境的良好模拟。
| 归档时间: |
|
| 查看次数: |
2665 次 |
| 最近记录: |