没啥意思的站点

修改gnome-terminal的title的办法和杂七杂八的ANSI控制码记录

折腾这个的原因是:有时候gnome-terminal的窗口开多了,就容易忘记哪个是哪个了,尤其是用脚本登录到多个不同服务器以后,就经常会混淆,把原本想在这个服务器上执行的命令输到那个服务器的窗口里面去了。这样有可能会造成非常严重的后果。
当然也有手工的解决办法,就是登录一个服务器就在 终端 – 设置标题 那里设置一下,就可以固定住了,但是这样每开一个tab都设置一下的办法确实很麻烦,所以我想修改脚本来实现把参数设置成标题。
想到平时emerge的时候,tab的标题是会变的,所以翻出portage的源码找,也找着了,把py的翻译成了bash的也很容易,简单的说,就是下面这一句:

echo -ne "\e]0;test\a" >&2 && sleep 3

在执行的3秒钟里,就可以看到title已经变成了test了。不过3秒一过,马上又变回PS1的样子了(具体是什么和 编辑-配置文件首选项-标题和命令 里面的设置有关)。写到sssh脚本里面也一样,在登录的瞬间是可以看到自定义的标题的,但是登录成功以后,又变成了远程机器的PS1的样子。
看了一下gnome-terminal的代码,似乎在不修改gnome-terminal的情况下是搞不定了,呵呵,得搞个接口修改gnome-terminal的内部数据?

另外,记一下不完全的ANSI控制码吧,上面这个改标题的,也是用了其中的一个:

\e[0m 关闭所有属性
\e[1m 设置高亮度
\e[2m 变暗
\e[4m 下划线
\e[5m 闪烁
\e[7m 反显
\e[8m 消隐
\e[9m 删除线
\e[30m ~ [37m 设置前景色(颜色值见下面说明)
\e[40m ~ [47m 设置背景色(颜色值见下面说明)
\e[nA 光标上移n行
\e[nB 光标下移n行
\e[nC 光标右移n行
\e[nD 光标左移n行
\e[y;xH 设置光标位置
\e[2J 清屏
\e[K 清除从光标到行尾的内容
\e[s 保存光标位置
\e[u 恢复光标位置
\e[?25l 隐藏光标
\e[?25h 显示光标

颜色代码:
  0 - 黑色     4 - 蓝色
  1 - 红色     5 - 粉红色
  2 - 绿色     6 - 青色
  3 - 黄色     7 - 白色

部分属性可以叠加进行设置,中间用“;”隔开,例如设置绿色前景、红色背景并高亮显示可以这样写: \e[01;32;41m

目前还没有找到所有代码的含义要查看全部的代码,请参考Emca-048标准。以上引用部分内容自出处一出处二

15 评论

  1. 汗,你可真丢人。我用 gnome-terminal 的缘故就是可以让他在登陆远程服务器的时候能显示 server name,我还区分上的是哪个服务器。

    把 \e]0;test\a 设置到 PS1 这个变量就可以了。你看看你的 PS1 ,在那个基础上改。

    • 如果不同的远程服务器都是按相同的规则设置了相同的PS1呢,我也不好为自己方便私自修改服务器的设置啊?然后用户名也是相同的,结果显示出来的都一样啊。不然我搞这个干嘛。。。

      • …. 你难道不能把你的 .bashrc 弄到所有服务器么?这个变量是可以自己设置的。。。

      • 汗,我明白你的意思了。。。
        那个 test 是可以用 \h 来代替的,\h 表示的是服务器 hostname, 你们服务器不会这个都是一样的吧。。…

  2. 唉,两个用 Gnome 的强人,你们难道就真的不想试试 screen??

  3. 笨笨骨头,可以设置不同颜色的阿。下面的是我zsh的提示符,如果是ssh登录的,hostname就红色,如果是有root权限的,用户名就红色。你用bash的话需要改改才能用。

    if [ "$SSH_TTY" = "" ]; then
        host="%B%F{magenta}%m%f%b"
    else
        host="%B%F{red}%m%f%b"                                                                     
    fi
    user="%B%(!:%F{red}:%F{green})%n%f%b"       #different color for privileged sessions
    symbol="%B%(!:%F{red}# :%F{yellow}> )%f%b"
    export PROMPT=$user"%F{yellow}@%f"$host$symbol
  4. 收藏,谢谢。

  5. [code]
    PS1=’\[\e[32;98;01m\]@\[\e[93;24;01m\]\T\n\[\e[61;36;21m\]\[\e[15;53;02m\] \[\e[21;48;01m\]\w\[\e[40;92;01m\]$ ‘

    PROMPT_COMMAND=’echo -ne “\e]1;${PWD}\a\e]2;${PWD}\a” ‘
    [/code]

  6. 楼主有最终解决方案没有了?

  7. 楼主可以用expect脚本,登录完成之后直接修改PS1变量即可

  8. 楼主还没有想到好的办法么,

    我是想实现 ssh 登录的时候 将ssh ip 中的ip当作标题显示在终端上

发表评论