58

シェルスクリプトを使用して画面タイトルを設定することはできますか?

キーコマンドを送信するようなことを考えましたctrl+ A shift-A Name enter

シェルスクリプトでキーストロークをエミュレートする方法を約1時間検索しましたが、答えが見つかりませんでした。

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内でこれらのシーケンスの1つを印刷すると、ウィンドウまたはアイコンのタイトルが変更されます。

注:これらのシーケンスは、nxterm、color-xterm、rxvtなどのほとんどのxterm派生物に適用されます。他の端末タイプは、多くの場合、異なるエスケープを使用します。例については、付録を参照してください。xtermエスケープシーケンスの完全なリストについては、xtermディストリビューションに付属しているファイルctlseq2.txt、またはrxvtディストリビューションに付属しているxterm.seqを参照してください。

エスケープシーケンスの印刷

ホストやユーザー名など、このシェルの存続期間を通じて一定である情報については、シェルのrcファイルにエスケープ文字列をエコーするだけで十分です。

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

シェル変数$USERと$HOSTが正しく設定されていると仮定すると、username@hostnameのようなタイトルを生成する必要があります。エコーに必要なオプションは、シェルによって異なる場合があります(以下の例を参照)。

現在の作業ディレクトリなど、シェルの存続期間中に変更される可能性のある情報については、プロンプトが変更されるたびにこれらのエスケープを実際に適用する必要があります。このようにして、発行するすべてのコマンドで文字列が更新され、現在の作業ディレクトリ、ユーザー名、ホスト名などの情報を追跡できます。一部のシェルはこの目的のために特別な機能を提供しますが、提供しないものもあり、タイトルシーケンスを挿入する必要がありますプロンプト文字列に直接。これについては、次のセクションで説明します。

于 2009-11-06T13:49:53.037 に答える
13

画面タイトルの名前変更をスクリプト化する他の方法は次のとおりです。

次の設定を追加して.ssh/config、SSHを使用してシステムにログインしたときに画面タイトルを自動的に設定します。

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

%h接続しているマシンのホスト名を表すの代わりに、マシン%nへの接続に使用した実際の名前/エイリアスであるを使用できます。

注:Localhost%nおよび%hパラメーターを使用できるようにするには、OpenSSH>=v5.1が必要です。LocalCommandの詳細については、「manssh_config」を確認してください。

タイトルを自動的にローカルホストのホスト名のタイトルに戻すには、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 -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

この問題に対する私の解決策は、bashスクリプトを作成し、それを〜/.bashrcファイルに追加することでした。

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

これで、bashシェルセッションに参加しているときに、「set-titledesired_title」と入力すると「desiredtitle」に変わります。これは、現在Kinetic16.04にあるUbuntuの複数のバージョンで機能します

私はここからこの解決策を得ました。もう一度探していましたが、見つかりませんでした。興味のある人のためにここに投稿しようと思いました。

于 2019-01-28T17:02:00.310 に答える
1

この解決策は、@flurin-arnerのように他の人と実験して得たものです。@weston-gangerset -title()を開始しました。@imgx64PROMPT_DIRTRIMの提案も使用ました。@itseranga gitブランチプロンプトも使用していますが、これはプロンプトで何ができるかを示す質問とは関係ありません。

最初にウェストン以上で示されているように

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

ターミナルタイトルを手動で設定するために使用できます。「$*」はコマンドライン入力ですが、必要なものではありません。

2番目に述べたように、プロンプトにgitブランチも追加していますが、これも質問の一部ではありません。

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\$ '
于 2019-05-22T19:20:04.333 に答える
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 に答える