58

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

我想过像发送键盘命令ctrl+ A shift-A Name enter

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

4

12 回答 12

59

您可以使用以下行设置屏幕 / 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 的答案。

于 2009-11-06T13:49:08.077 回答
21

来自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、color-xterm 和 rxvt。其他终端类型通常使用不同的转义;示例见附录。有关 xterm 转义序列的完整列表,请参见 xterm 发行版随附的文件 ctlseq2.txt 或 rxvt 发行版随附的 xterm.seq。

打印转义序列

对于在这个 shell 的整个生命周期中保持不变的信息,例如主机和用户名,只需在 shell rc 文件中回显转义字符串就足够了:

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

假设 shell 变量 $USER 和 $HOST 设置正确,应该产生一个类似 username@hostname 的标题。echo 所需的选项可能因外壳而异(请参见下面的示例)。

对于在 shell 的生命周期中可能发生变化的信息,例如当前工作目录,这些转义确实需要在每次提示更改时应用。这样,字符串会随着您发出的每个命令而更新,并且可以跟踪当前工作目录、用户名、主机名等信息。有些 shell 为此提供了特殊功能,有些则没有,我们必须插入标题序列直接进入提示字符串。这将在下一节中说明。

于 2009-11-06T13:49:53.037 回答
13

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

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

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

您可以使用代替%h,它代表您正在连接的机器的主机名%n,它是您用于连接到机器的实际名称/别名。

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

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

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"
于 2012-06-22T14:03:20.840 回答
11

试试下面的命令,不需要像 ~/.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\$ '
于 2014-03-20T00:52:11.327 回答
7
set_screen_title ()
{
    echo -ne "\ek$1\e\\"
}
于 2009-11-06T13:49:17.453 回答
4

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

screen -X title "new title"

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

于 2011-02-24T22:14:32.607 回答
3

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

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'
于 2012-05-04T22:17:32.113 回答
2

要在使用 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

于 2014-02-08T02:54:44.700 回答
1
 # add the following in your ~/.bashrc or ~/.bash_profile
 PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

甚至更好地复制整个概念,以便从这里在许多主机之间自定义 bash 配置

于 2017-07-28T14:36:23.400 回答
1

我通过与其他人的实验得到了这个解决方案,比如 @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 参数显示 \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\$ '
于 2019-05-22T19:20:04.333 回答
1

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

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

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

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

于 2019-01-28T17:02:00.310 回答
0

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

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

在此处输入图像描述

于 2019-12-23T14:10:11.960 回答