【问题标题】:Set screen-title from shellscript从 shell 脚本设置屏幕标题
【发布时间】:2026-02-18 01:25:02
【问题描述】:

是否可以使用 shell 脚本设置屏幕标题?

我想过像发送按键命令 ctrl+A shift-A Name 输入

我搜索了大约一个小时关于如何在 shell 脚本中模拟击键,但没有找到答案。

【问题讨论】:

    标签: bash title gnu-screen xterm


    【解决方案1】:

    您可以使用以下几行设置屏幕/xterm 标题:

    #!/bin/bash
    
    mytitle="Some title"
    echo -e '\033k'$mytitle'\033\\'
    

    [更新] - 根据要求,我还包括以下@Espo 提出的解决方案:

    根据您的 xterm 版本或您的 linux 发行版,上面的行可能有效也可能无效,您可以尝试 xterm-defaults:

    #!/bin/bash
    
    mytitle="Some title"
    echo -e '\033]2;'$mytitle'\007'
    

    有关详细信息,请参阅:http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#s3 或参考下面@Espo 的答案。

    【讨论】:

    • 这对我不起作用。我在 xterm 和 Konsole(来自 KDE4)中进行了测试。 "\e]2;title\a" 工作。
    • 如果启用了“允许发送事件”,这将不起作用,这似乎是 ubuntu 最新版本的默认设置:bugs.launchpad.net/ubuntu/+source/xterm/+bug/495733
    • 我认为我们可以同意没有包罗万象的解决方案(叹气)。这里最好的例子是 Konsole,它可以使用 \033k(或 \ek)但更喜欢\e]2; (或相反.. as \e]2; 似乎是 xterm 默认值)
    • @Shirkrin 请阅读以下 Espo 引用的内容。最后您必须发送\007 (BEL)。 (提醒詹姆斯邦德可能会有所帮助,哈哈。)很可能这就是丹尼尔森没有机会让你的线路正常工作的原因。
    • 还要注意,用户的提示字符串包含设置窗口标题是很常见的。放一个 ;sleep 10s 在它的末尾,如果窗口改变和改变,那么你需要调整 $PS1
    【解决方案2】:

    来自http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#s3

    xterm 转义序列

    窗口和图标标题可能会改变 在运行的 xterm 中使用 XTerm 转义序列。下列 序列在这方面很有用:

    • ESC]0;stringBEL -- 设置图标名称和窗口标题为字符串
    • ESC]1;stringBEL -- 将图标名称设置为字符串
    • ESC]2;stringBEL -- 设置窗口标题为字符串

    其中 ESC 是转义字符 (\033),BEL 是响铃字符 (\007)。

    在其中打印这些序列之一 xterm 将导致窗口或 要更改的图标标题。

    注意:这些序列适用于大多数 xterm 衍生物,例如 nxterm, 颜色 xterm 和 rxvt。其他终端 类型经常使用不同的转义;看 附录中的例子。为了 xterm 转义序列的完整列表 查看文件 ctlseq2.txt,它来自 使用 xterm 分布,或 xterm.seq,随 rxvt 分布。

    打印转义序列

    对于恒定的信息 在这个外壳的整个生命周期中, 例如主机和用户名,它将 简单地呼应逃跑就足够了 shell rc 文件中的字符串:

        echo -n "\033]0;${USER}@${HOST}\007"
    

    应该产生一个像 用户名@主机名,假设是 shell 变量 $USER 和 $HOST 已设置 正确。所需的选项 echo 可能因外壳而异(参见示例 下面)。

    关于在此期间可能会发生变化的信息 shell 的生命周期,例如当前 工作目录,这些转义 真的每次都需要申请 提示改变。这种方式 每个命令都会更新字符串 您发出并可以跟踪 当前工作等信息 目录、用户名、主机名等 一些外壳提供特殊功能 为此,有些人不这样做,我们 必须插入标题序列 直接进入提示字符串。这 在下一节中说明。

    【讨论】:

    • Screen 然而似乎完全忽略了这一点,尽管我发现 sn-ps 同时使用 "\ekTITLE\e\\" 和 "\e]0;TITLE\a" (后者没有任何显然使用)。也许这与屏幕“hardstatus”设置有关 - 我在那里使用以下内容:hardstatus string“SCREEN @ %H: %-n - %t”(%t 指窗口标题)
    【解决方案3】:

    以下是屏幕标题重命名脚本的其他方法:

    将以下设置添加到.ssh/config 会在使用 SSH 登录系统时自动设置屏幕标题:

    Host *
      PermitLocalCommand yes
      LocalCommand [ "$TERM" == 'screen' ] && echo -ne "\033k%h\033\\" 
    

    你可以使用%n,而不是%h,它代表你正在连接的机器的主机名,它是你用来连接机器的实际名称/别名。

    注意:您需要 OpenSSH >= v5.1 才能使用 Localhost %n 和 %h 参数。查看“man ssh_config”以获取有关 LocalCommand 的更多信息。

    要自动恢复标题,回到 localhost 的主机名,在关闭 SSH 会话后,您可以在 .bashrc 中的提示变量 PS1 中添加转义序列:

    export PS1='you_favorite_PS1_here'
    if [ "$TERM" == 'screen' ]; then
        export PS1=${PS1}'\[\033k\h\033\\\]'
    fi
    

    这些技巧在使用.screenrc 配置时特别有用,该配置显示您当前正在哪个屏幕“选项卡”中工作。将以下内容添加到 .screenrc 以使其正常工作:

    caption always "%{= kY}%-w%{= Yk}%n %t%{-}%+w%{ kG} %-= @%H - %LD %d %LM - %c"
    

    【讨论】:

    • 使用LocalCommand echo "$TERM" | grep -q 'screen' && echo -ne "\033k%n\033\\" 也可以在 tcsh 中使用
    【解决方案4】:

    试试下面的命令,不需要像~/.bashrc那样编辑任何文件或配置,可以在运行时使用。

    设置静态文本为标题:(我的标题)

    export PS1='\[\e]0;My Title\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    

    将本地/全局变量设置为标题:($USER)

    export PS1='\[\e]0;$USER\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    

    将命令输出设置为标题:(主机名)

    export PS1='\[\e]0;`hostname`\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    

    设置为默认值(恢复):

    export PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    

    【讨论】:

    • 这会改变提示。
    【解决方案5】:
    set_screen_title ()
    {
        echo -ne "\ek$1\e\\"
    }
    

    【讨论】:

      【解决方案6】:

      你也可以调用screen并告诉它设置标题:

      screen -X title "new title"
      

      如果您在屏幕窗口中,它将设置该窗口的名称。如果您不在屏幕中,它将设置最近打开的窗口的名称。

      【讨论】:

        【解决方案7】:

        要添加到 Espo 的答案,xterm 转义序列也可以应用于 Bash PS1 变量

        ESC]0;stringBEL -- Set icon name and window title to string
        ESC]1;stringBEL -- Set icon name to string
        ESC]2;stringBEL -- Set window title to string
        

        例子

        PS1='\e]0;string\a'
        

        【讨论】:

          【解决方案8】:

          要在使用 ssh 跳转时启用自动标题更新,请将其添加到 ~/.bashrc

          ssh() {
            echo -n -e "\033k$1\033\\"
            /usr/bin/ssh "$@"
            echo -n -e "\033k`hostname -s`\033\\"
          }
          echo -n -e "\033k`hostname -s`\033\\"
          

          http://linuxepiphany.blogspot.com.ar/2010/05/good-screenrc-config-setup.html

          【讨论】:

          • 你应该更喜欢printf而不是echo -n e
          【解决方案9】:
           # add the following in your ~/.bashrc or ~/.bash_profile
           PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
          

          或者甚至更好地复制整个概念,以便在来自 here 的大量主机之间自定义 bash 配置

          【讨论】:

            【解决方案10】:

            我对这个问题的解决方案是创建一个 bash 脚本并将其添加到我的 ~/.bashrc 文件中:

            set-title() {
              ORIG==$PS1
              TITLE="\e];$@\a"
              PS1=${ORIG}${TITLE}
            }
            

            现在,当我在任何 bash shell 会话中时,我输入“set-title desired_title”,它会变为“desired title”。 这适用于多个版本的 Ubuntu,目前在 Kinetic 16.04 上

            我从here 得到了这个解决方案。我又在找它,找不到它,我想我会把它贴在这里给任何有兴趣的人。

            【讨论】:

              【解决方案11】:

              我通过与其他人的实验得到了这个解决方案,比如@flurin-arner 我启动了@weston-ganger set-title()。我还使用了@imgx64 PROMPT_DIRTRIM 建议。我也在使用@itseranga git branch prompt,尽管这与它确实显示了您可以使用提示做什么的问题无关。

              首先如weston及以上所示

               TITLE="\[\e]2;$*\a\]"
              

              可以用来手动设置终端标题,“$*”是命令行输入,但不是我们想要的。

              第二如前所述,我还将 git branch 添加到我的提示中,这也不是问题的一部分。

              export PROMPT_DIRTRIM=3
              parse_git_branch() {
                     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
                   }
              
              export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "
              

              3,通过实验,我复制了上面的 TITLE 代码,将 $* 设置为固定字符串并尝试了这个:

              see: \[\e]2;'SomeTitleString'\a\]
              
              export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\]\[\e]2;'SomeTitleString'\a\] $ "
              

              这达到了预期的效果!最终,我想要基本路径作为我的标题。 PS1 Params 表明 \W 是基本路径,所以我的解决方案是:

              export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\]\[\e]2;\W\a\] $ "
              

              没有 git 分支:

              export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\[\033[00m\]\[\e]2;\W\a\] $ "
              

              导致 git-branch 提示:

              user@host ~/.../StudyJava (master) $  
              

              导致没有 parse_git_branch 的提示:

                 user@host ~/.../StudyJava $  
              

              pwd 给出的地方

              /home/user/somedir1/otherdir2/StudyJava
              

              和终端标题

              StudyJava
              

              注意:从上面的@seff,我本质上是用“\W”替换“我的标题”

              export PS1='\[\e]0;My Title\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
              

              【讨论】:

                【解决方案12】:

                我在 Ubuntu 18.10 上试过这个,它只适用于 ~/.bashrc 中的 PROMPT_COMMAND。 如果您覆盖 PROMPT_COMMAND,则标题的行为会略有变化。我决定仅在必要时进行更改:

                t() {
                  TITLE="$@"
                  PROMPT_COMMAND='echo -ne "\033]0;${TITLE}\007"'
                }
                

                enter image description here

                【讨论】: