プロンプトを変更せずにCygwinでタイトルを変更する

プロンプトを変更せずにCygwinでタイトルを変更する

次のシェルスクリプト機能がありますこのウェブサイトこれにより、PuttyとCygwinでヘッダーを変更できます。 Linuxホストに接続されているPuttyでは、タイトルが変更され、プロンプトは変更されていません。ただし、Cygwinではタイトルが変更され、プロンプトは$または#記号で表示されます。

タイトルは変更しますが、プロンプトは変更されていないCygwin用のバージョンを作成したいと思います。 (ここに投稿する前に自分で作成する必要があることを知っていますが、プロンプト文字列が常に混乱していることに気づきました。)

編集する:user@hostnameより具体的には、Cygwinでは、現在のディレクトリが続くデフォルトのプロンプトが好きです。そのヒントを大事にしたい。

編集2: 作業が簡単になると、デフォルトのCygwinプロンプトの色が維持されるかどうかは問題ありません。少なくともプロンプトにディレクトリが必要です。

これが私が持っているものです:

function wtitle {
  if [ "$TERM" == "xterm" ] ; then
    # Remove the old title string in the PS1, if one is already set.
    PS1=`echo $PS1 | sed -r 's/^\\\\\[.+\\\\\]//g'`
    export PS1="\[\033]0;$1 - \u@\h:\w\007\]$PS1"
  else
    echo "You are not working in xterm. I cannot set the title."
 fi
}

`

答え1

追加してください

PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\$'

~/.bashrc の最後の行に再度ログインするか、次を実行します。

source ~/.bashrc

答え2

OPが要求するのは、ターミナルエミュレータが実行されているウィンドウのタイトルを設定することです。これを実行することでこれを達成できるので、PS1への参照は混乱しています。

printf '\e]2;%s\a' "My Title"

少なくともこれはmintty 2.7(+ Cygwin 2.8)で動作します。 (質問が最初に公開されてから状況が変わった可能性があります。)

答え3

SSHサーバーにログインしてもヘッダーがまったく更新されない場合は、cygwinにOpenSSHパッケージをインストールしてみてください。

私にとって、cygwinは、ヘッダーエスケープ文字をSSHスタックを介して渡さないいくつかのWindows 10 Pro OpenSSHビルドを使用していました。

誰かがこれに1時間を費やすのを防ぐためにこれを投稿するようです。

答え4

2つの質問があります。

  1. そうしない妥当な理由がなく、自分が何をしているのかを知らない限り、常にシェル変数を引用する必要があります。echo $PS1そうする必要がありますecho "$PS1"。これにより、プロンプトで末尾のスペースが失われます。つまり$。場合によっては、他の問題が発生する可能性があります。
  2. Bashは\[...を使用して、\]エスケープシーケンス、つまりプロンプトの一部として画面に表示されない文字を区切ります。これには、ウィンドウのタイトルを設定するエスケープシーケンスだけでなく、(表示される)プロンプト内で色を変更するエスケープシーケンスも含まれます。あなたのスクリプトは

    s/ ^ \\\\\[ .+ \\\\\] //g
    

    (明確にするためにスペースを追加しました)。一見すると、削除しようとしているようです。みんな \[… …\]順序。 (実際にはあります。二つそうしない理由。 )主な問題は、.+可能な限り長い文字列を一致させることです。どの数値。これは\[、最初のシーケンスの先頭から\]最後のシーケンスの終わりまで、すべての内容\[\]つまり最後の色の変更までのすべての内容を削除することを意味します。

    ウィンドウのタイトルを設定するためにエスケープシーケンスを削除したいと思います。私たちは通常変化します.+(どこで.マッチどの文字)を]。しかし、これはウィンドウタイトルのエスケープシーケンスが設定されているという事実によって複雑になります。含む]、だから私たちは渡す必要があります 第二 ]:

    s/^\\\\\[[^]]+][^]]+\\\\\]//g
    

    後で状況に合わせてお見せします...

  3. これは問題ではありませんそれ自体、しかし`...`古い構文です。代わりに$(...を使用することをお勧めします)。一部の投稿では、機能的に交換可能であるとマークされているようです。他の引用/エスケープ規則は適用されません。幸い、この場合、これは私たちにとって有利に働きます。$(...に切り替えると、少数のバックスラッシュを使用するようにコマンドを)変更できます。sed
  4. 別の問題:functionキーワードの使用はお勧めできません。お好みの構文は下記をご覧ください。

したがって、上記の内容をすべてまとめると、次のような結果が得られます。

wtitle() {
  if [ "$TERM" == "xterm" ] ; then
    # Remove the old title string in the PS1, if one is already set.
    PS1=$(echo "$PS1" | sed -r 's/^\\\[[^]]+][^]]+\\\]//g')
    export PS1="\[\033]0;$1 - \u@\h:\w\007\]$PS1"
  else
    echo "You are not working in xterm. I cannot set the title."
 fi
}

これさえ完璧ではないと言えば十分です。PS1まず、ウィンドウタイトルエスケープシーケンスの既存の値によって異なります。

関連情報