从shell脚本设置屏幕标题

时间:2009-11-06 13:37:37

标签: bash title gnu-screen xterm

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

我想过发送关键命令 ctrl + A shift - A {{1} } 输入

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

12 个答案:

答案 0 :(得分:48)

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

答案 1 :(得分:19)

来自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转义序列表   看到文件ctlseq2.txt,来了   与xterm分布,或   xterm.seq,与rxvt一起提供   分布。

     

打印转义序列

     

对于不变的信息   在这个shell的整个生命周期中,   如主机和用户名,它会   足以简单地回应逃脱   shell rc文件中的字符串:

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

应该产生一个标题   username @ hostname,假设是shell   变量$ USER和$ HOST已设置   正确。所需的选项   回声可能因shell而异(参见示例)   下文)。

     

有关可能在期间发生变化的信息   shell的生命周期,如current   工作目录,这些逃脱   确实需要每次都应用   提示改变。这样的   每个命令都会更新字符串   你发布并可以跟踪   当前工作等信息   目录,用户名,主机名等   有些炮弹提供特殊功能   为此目的,有些人不和我们一样   必须插入标题序列   直接进入提示字符串。这个   将在下一节中说明。

答案 2 :(得分:11)

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

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

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

代替%h,它代表您要连接的计算机的主机名,而不是%n,这是您用来连接计算机的实际名称/别名。

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

要自动恢复标题,返回到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"

答案 3 :(得分:10)

尝试以下命令,无需编辑任何文件或配置,如〜/ .bashrc,可以在运行时使用。

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

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

将local / global变量设置为title:($ 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\$ '

答案 4 :(得分:7)

set_screen_title ()
{
    echo -ne "\ek$1\e\\"
}

答案 5 :(得分:3)

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

screen -X title "new title"

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

答案 6 :(得分:2)

要添加到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'

答案 7 :(得分:1)

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

答案 8 :(得分:0)

 # add the following in your ~/.bashrc or ~/.bash_profile
 PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

甚至更好地复制整个概念,以便在here

的许多主机之间自定义bash配置

答案 9 :(得分:0)

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

/**
 * Generic background Cloud Function to be triggered by Cloud Storage.
 *
 * @param {object} event The Cloud Functions event.
 * @param {function} callback The callback function.
 */

let request = require("request");
let Storage = require('@google-cloud/storage');
let Client = require('ssh2-sftp-client');
let sftp = new Client();
const fs = require('fs');
const storage = new Storage({projectId: process.env.PROJECT_ID});

exports.retrieveFilesFromSFTP = (event, callback) => {


    let pubsubMessage = event.data;
    let fileName = pubsubMessage.data
        ? Buffer.from(pubsubMessage.data, 'base64').toString()
        : 'No Files in pubsub';


    console.log(fileName, 'File name from Pub/Sub Message was received');


    fs.readdir(__dirname, (err, files) => {
        if (err) {
            console.error(err);
            res.sendStatus(500);
        } else {
            console.log('Files', files);
            res.sendStatus(200);
        }
    });

    getFilesFromSFTP(fileName);
    callback();
};

function getFilesFromSFTP(fileName) {

    const bucket = storage.bucket('dataflowdirectory');

    const outFile = bucket.file("relex_output/"+fileName);



    sftp.connect({
        host: process.env.SFTP_SERVER,
        port: process.env.SFTP_PORT,
        username: process.env.SFTP_USER,
        password: process.env.SFTP_PASSWORD
    }).then(() => {


        sftp.list(process.env.SFTP_OUTBOUND_PATH)
            .then((data) => {

                sftp.get(process.env.SFTP_OUTBOUND_PATH + "/" + fileName).then((data) => {

                    data.pipe((outFile.createWriteStream({gzip: true})
                        .on('error', function (err) {
                            console.error("error",err);
                        })
                        .on('finish', function () {
                            // The file upload is complete.
                            sftp.end();
                        })));

                });

            }).catch((err) => {
            console.log(err);

        });

    })

现在,在任何bash shell会话中,我键入“ set-title required_title”,然后将其更改为“ desired title”。 这适用于目前在Kinetic 16.04上的多个版本的Ubuntu

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

答案 10 :(得分:0)

我是通过与其他人(例如@ flurin-arner)一起尝试而获得此解决方案的,我开始了@ weston-ganger set-title()。我还使用了@ imgx64 PROMPT_DIRTRIM的建议。我也在使用@itseranga git branch prompt,尽管这与问题确实显示了您可以对提示执行的操作无关。

首先,如韦斯顿及其以上所示

 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\$ '

答案 11 :(得分:0)

我在Ubuntu 18.10上尝试了此方法,它仅与〜/ .bashrc 中的 PROMPT_COMMAND 一起使用。 而且,如果您覆盖 PROMPT_COMMAND ,则标题的行为会稍有变化。我决定仅在必要时进行更改:

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

enter image description here