【问题标题】:what does tty -s have to do with detecting whether a shell is interactive? [closed]tty -s 与检测 shell 是否是交互式的有什么关系? [关闭]
【发布时间】:2020-12-12 13:47:59
【问题描述】:

我有一个第三方 shell 函数正在尝试使用 tty -s 来检测它是否是从交互式 shell 调用的,但报告它在交互式 shell 中,即使它不是。

#!/usr/bin/env bash

get_shell_type() {
    tty -s && echo "INTERACTIVE" || echo "NON-INTERACTIVE"
}

为什么这会起作用?我该如何解决?

【问题讨论】:

  • 这是一个检测shell是否交互的尝试。
  • 是的,我可以猜到,但我不明白它是如何做到的。当我在同一个脚本中调用 get_shell_type 时,它​​不是返回“INTERACTIVE”。
  • 我建议bash[[ $- =~ i ]] && echo "INTERACTIVE" || echo "NON-INTERACTIVE"
  • man tty 告诉你了吗?
  • 我投票结束这个问题,因为它要求猜测其他人的想法。除了原作者,没有人确切地知道他们的意图是什么,以及为什么他们编写了这个(错误的)代码而不是正确的实现。

标签: bash


【解决方案1】:

可能试图确定输出是否被写入交互式终端,而不是shell本身是否是交互式的。

如果是这样,它是一个较慢/效率较低/错误的等效于以下内容:

get_shell_type() {
  if [[ -t 0 ]]; then echo INTERACTIVE; else echo NON_INTERACTIVE; fi
}

如果目标是确定一个 shell 是否具有交互性,那就大错特错了。

shell 是否具有交互性其标准输入是否连接到 TTY 的影响(作为在不清楚的情况下用来猜测的启发式方法),但最终决定毕竟启发式完成反映在set -i 是否处于活动状态。与所有其他set 标志一样,活动标志可以在$- 中看到。因此:

get_shell_type() {
  case $- in *i*) echo "INTERACTIVE";; *) echo "NON-INTERACTIVE";; esac
}

另见:

【讨论】:

    猜你喜欢
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    相关资源
    最近更新 更多