确定终端类型(传统Unix终端 vs 图形化终端)

4
我正在通过.bashrc配置我的提示符(PS1),但是我发现一个问题:我正在使用256色方案。这与经典终端(例如通过Ctrl+Alt+F2访问的终端)不兼容,但在图形终端中如gnome-terminal、terminator等看起来很漂亮。
因此,我需要根据终端类型更改我的提示符。为此,我需要一个条件来测试终端类型的if子句。你知道怎么做吗?

FYI,“classic terminal” 被称为控制台。 - glenn jackman
5个回答

5

TERM 变量表示终端类型。 当在 X 终端上运行时,通常为 xterm (但也可以是 Dmitry 在他的回答中提到的 xterm-color-256)。 以下代码检查 $TERM 的值是否以 xterm 开头(因此可以捕获多个情况):

case "$TERM" in
   xterm*)
      echo "running as an x-terminal"
      ;;
   *)
      echo "not running as an x-terminal"
      ;;
esac

3

echo $TERM会给你终端类型。


2
这应该可以正常工作:
if [ "$TERM" == "xterm-color-256" ]; then echo "YES"; fi

2
另一种方法:查看当前shell的父进程。如果它是“login”,则表示你在控制台中。
parent=$(ps --pid $(ps --pid $$ --no-headers --format ppid) --no-headers --format cmd)
if [[ $parent == login* ]]; then
    echo console
    PS1='plain> '
else
    echo assume you can get away with more
    PS1='fancy> '
fi

1
您可以使用$TERM的值来决定是否拥有彩色终端,但是该值可能会被修改。问题是打开新终端窗口时设置此环境变量的位置。
这将在.bashrc文件中。但是,请注意:
  • $TERM的值可能是错误的。这只是一个设置的环境变量。如何设置由终端程序决定(在Mac上,Terminal.app可以将终端设置为xtermxterm-colorvt100ansi和其他几个)。
  • 终端可能是彩色终端,但不使用ANSI颜色代码。如果您仅假定特定的转义序列会给您带来特定的颜色,您可能会遇到麻烦。
  • 如果您的提示设置在.bashrc文件中,则更改$TERM的值不会更改提示。
话虽如此,我可能会这样做:
case $TERM in
    *color*)    PS1=...;;
    *)          PS1=...;;
esac

这样一来,如果我说它是xterm-color或者xterm-256color,我的终端就会设置为彩色。

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