web-dev-qa-db-ja.com

シェルスクリプトからスクリーンタイトルを設定する

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

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

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

47
Beerweasle

次の行を使用して、画面/ 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#s を参照するか、以下の@Espoの回答を参照してください。

50
Shirkrin

から http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#s

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のようなタイトルを生成する必要があります。エコーに必要なオプションは、シェルによって異なる場合があります(以下の例を参照)。

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

18
Espo

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

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

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

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

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

SSHセッションを閉じた後、自動的にローカルホストのホスト名のタイトルに戻すために、エスケープシーケンスを追加できますプロンプト変数PS1 in .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"
12
Johnny Halfmoon

〜/ .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\$ '
10
Seff
set_screen_title ()
{
    echo -ne "\ek$1\e\\"
}
7
Randy Proctor

Screenを呼び出してタイトルを設定するように伝えることもできます:

screen -X title "new title"

画面ウィンドウにいる場合は、そのウィンドウの名前が設定されます。画面にいない場合は、最後に開いたウィンドウの名前が設定されます。

3
idbrii

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'
2
Steven Penny

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 を参照してください

1
mijhael3000

@ flurin-arnerのように、@ weston-ganger set-title() を開始したなど、他の人と実験してこのソリューションを得ました。 @ imgx64 Prompt_DIRTRIM 提案も使用しました。 @itseranga git branch Prompt も使用していますが、これはプロンプトで何ができるかを示す質問とは関係ありません。

最初にweston以上で示すように

 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から、本質的に「My Title」を「\ W」に置き換えています。

export PS1='\[\e]0;My Title\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
0
mancocapac
 # add the following in your ~/.bashrc or ~/.bash_profile
 Prompt_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

または、多くのホスト間でbash構成をカスタマイズするためのコンセプト全体を here

0
Yordan Georgiev

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

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

Bashシェルセッションにいるとき、「set-title desired_title」と入力すると、「desired title」に変わります。これは現在Kinetic 16.04上にあるUbuntuの複数のバージョンで動作します

here からこの解決策を得ました。私は再びそれを探していましたが、それを見つけることができず、興味のある人のためにここに投稿すると思いました。

0
Flurin Arner