如何在bash脚本中识别当前的终端模拟器?

12

我有一个脚本可以在OS X终端应用程序中打开一个新标签页,现在想添加对iTerm2的支持。不幸的是,这两个终端模拟器打开标签页的方法不同。

我该如何判断当前使用或打开的是哪个终端模拟器,以便有条件地运行正确的脚本呢?


他们是否设置$TERM不同? - Keith Thompson
“applescript”标签真的适用吗? - Keith Thompson
我认为这可能是一个AppleScript解决方案,因为制表符解决方案是如此。 - jonathanpglick
@MrDaniel:嗯,也许吧。如果他们设置了$TERM不同,那可能是一个解决办法(尽管我本可以表达得更好)。 - Keith Thompson
我的实际答案可能应该是一个评论:“他们是否设置了 $TERM 不同?”上面的评论是对那个答案的评论,如果没有上下文,它就没有太多意义。 - Keith Thompson
我看到“他们是否设置$TERM不同?”现在是一条注释(可能我之前没有注意到)。大概过一天左右,我会删除大部分这些注释。 - Keith Thompson
3个回答

18

我不确定如何区分iTerm和iTerm2,但请检查$TERM_PROGRAM环境变量。对于我而言(Mac OS X 10.7),它返回Terminal.appApple_Terminal,并且返回iTerm2的iTerm.app


1
$TERM_PROGRAM 环境变量的效果很好——我只是想测试 iTerm.app 并将 Terminal.app 版本作为默认版本。谢谢! - jonathanpglick
1
如果您运行了tmux,无论您是从iterm还是默认的苹果终端运行它,此命令都将返回“tmux”。 - skamsie

5

在Ubuntu和Mint Linux上工作良好--

ps -o comm= -p "$(($(ps -o ppid= -p "$(($(ps -o sid= -p "$$")))")))"

2
这在我的Arch + alacritty + zsh上运行良好。不过,进一步解释这个魔法会很棒 :) - maricn
@maricn,请参见 https://unix.stackexchange.com/a/264353/110635 进一步解释。 - bovender
在 macOS 上使用 zsh 失败:ps: sid: 关键字未找到\n ps: 无效的关键字;有效的关键字:\n zsh: 错误的数学表达式:需要操作数 \%cpu %mem ...'` - iconoclast
对于Lispy方案表示肯定,但是Bash不是一个很好的Lisp,因为存在许多引用陷阱。使用更简单的方式(比如类Haskell?)只需使用普通管道即可实现:$ ps -o sid= -p "$$" | xargs ps -o ppid= -p | xargs ps -o comm= -p - ack

-3

你应该能够:

ps -p $$ | tail -1 | awk '{print $NF}'

3
这只会返回他们正在运行的 shell,而不是终端仿真器(例如 xterm…)。 - chutsu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接