shをプライマリシェルとしてリモートコンピュータに接続した後、タイトルバーが自動的に動的に更新されるようにするにはどうすればよいですか?

shをプライマリシェルとしてリモートコンピュータに接続した後、タイトルバーが自動的に動的に更新されるようにするにはどうすればよいですか?

リモートUbuntuシステムに接続するたびに、gnome-terminalは"$USER"@"$(hostname -s)": "$PWD"。コマンドを実行します。

shをデフォルトのシェルとして使用してFreeBSDシステムにユーザーとして接続すると、gnome-terminalのヘッダーは更新されません。

.shrcファイルに以下を入れました。

PS1='['"$USER"'@\h \w'
case "$USER" in
    root)
        PS1="${PS1}]# "
        ;;
    *)
        PS1="${PS1}]$ "
        ;;
esac

esc="$(printf '\033')"
bel="$(printf '\007')"

case "$TERM" in
    xterm)
        #cannot get this part to work
        PS1='['"${esc}"'0;'"${USER}"'@\h \w'"$bel"']'"$PS1"
        ;;
    *)
        ;;
esac

だからここに問題があります。便利なリソースがたくさん見つかりましたが、POSIX準拠のshを使用してヘッダーを設定する方法を示すリソースはありません。これは私が最も役に立つと思いました(実際にこれを参照として使用してbashとkshにヘッダを設定できました)。

xtermのタイトルを変更する方法:他のシェルの例

ほとんど来たようですが、タイトルバーを設定するためにshに何を与えるべきかわからないようです。

答え1

POSIX shで良いプロンプトを得る方法を見つけるために、PS1のsh実装で解決しなければならなかった2つの制限に遭遇しました。

  1. \win var はPS1機能しますが、$HOME次には展開されません。~

  2. PS1以下を使用して端末のプロンプトをPS1更新できます. bashまたはkshを使用している場合、および文字はESCヘッダーBELを期待どおりに設定しません。

これが最終結果であり、本当にうまくいきます。これを.shrcファイルに追加する必要があります(まず、PS1がまだ定義されていないことを確認してください)。

update_prompt() {
    case "$PWD" in
        "$HOME"*)
            pretty_pwd="~${PWD#*"${HOME}"}"
            ;;
        "/usr$HOME"*)
            pretty_pwd="~${PWD#*"/usr${HOME}"}"
            ;;
        *)
            pretty_pwd="$PWD"
            ;;
    esac

    case "$TERM" in
        xterm*|rxvt*)
            PS1="($USER@\\h $pretty_pwd)\\$ "
            ;;
        *)
            ;;
    esac

    printf "\\033]0;(%s@$(hostname -s): %s)\\007" "$USER" "$pretty_pwd"
}

update_prompt

cd() {
    command cd "$@" && update_prompt
}

プロンプトは括弧内に表示されます。これは私がUbuntuではなくFreeBSDを使用していることを自分自身に個人的に思い出させます。より伝統的なプロンプトが必要な場合は、次を使用してください。

update_prompt() {
    case "$PWD" in
        "$HOME"*)
            pretty_pwd="~${PWD#*"${HOME}"}"
            ;;
        "/usr$HOME"*)
            pretty_pwd="~${PWD#*"/usr${HOME}"}"
            ;;
        *)
            pretty_pwd="$PWD"
            ;;
    esac

    case "$TERM" in
        xterm*|rxvt*)
            PS1="$USER@\\h $pretty_pwd\\$ "
            ;;
        *)
            ;;
    esac

    printf "\\033]0;%s@$(hostname -s): %s\\007" "$USER" "$pretty_pwd"
}

update_prompt

cd() {
    command cd "$@" && update_prompt
}

"/usr$HOME"*)Linuxを使用している場合は、この条件を削除できます。/home通常、FreeBSDを使用しない限り役に立ちません/usr/home

関連情報