PS1環境変数の理解

PS1環境変数の理解

PS1StackoverflowでLinuxターミナルプロンプトを担当する環境変数について質問をしました。

私のヒントは次のとおりです。

username@PORT-usr:/dir
  • usernameWSLへのログインに使用するユーザー名。
  • PORT-usr私のラップトップの名前です。
  • /dir私の現在のディレクトリです。

私のPS1環境変数は次のとおりです。

Prompt>echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$

これを試しても機能しません。

Prompt>echo $($PS1)
\[\e]0;\u@\h:: command not found

Prompt>echo echo $(\[\e]0;\u@\h: \w\a\]${debian_chroot...)
e]0: command not found
u@h:: command not found
32m]u@h[033[00m]:[033[01: command not found
34m]w[033[00m]$: command not found

使用される変数の構文は何ですか$PS1?この構文を理解する方法を学ぶには、どのコマンドを使用できますか?

答え1

シェルPS1変数(環境変数であってもなくてもよい)には、通常のシェルコマンドは含まれていません。使用しているさまざまなシェルに固有の特別なプロセスを使用してプロンプトに展開されます。echo通常のコマンドとして認識されない特別なシーケンスが含まれることがあります。

シェルプロンプトは、Debian(および関連ディストリビューション)のデフォルトプロンプトのように見えます。通常のユーザーアカウントの Debian のデフォルトシェルですので、bash確認する必要がありますPROMPTINGman bashまたは6.9章:制御プロンプトバッシュリファレンスマニュアル。

組み込みの端末制御コードを理解するには、端末エミュレータに対応する文書を参照する必要があります。Xterm制御シーケンスリファレンス

現在のプロンプトの解釈方法は次のとおりです。

\[ ... \]     encapsulates any terminal control codes that will not result in
              any visible output on the prompt line

\e]0;         Xterm control code to set terminal window title and icon name
\u@\h: \w     expands to window title <username>@<hostname>: <workdir>
\a            indicates the end of terminal window title / icon name string
\]            end of encapsulation

${debian_chroot:+($debian_chroot)}
              if variable $debian_chroot is defined, adds text
              "(<contents of $debian_chroot>)" to the prompt

\[            encapsulates terminal control codes, see above
\033[01;32m   set bold output with green foreground color
\]            end encapsulation

\u@\h         expands to "<username>@<hostname>" in the prompt

\[            encapsulates terminal control codes, see above
\033[00m      reset to normal output
\]            end encapsulation

:             outputs a ":" character

\[            encapsulates terminal control codes, see above
\033[01;34m   set bold output with blue foreground color
\]            end encapsulation

\w            outputs the current working directory

\[            encapsulates terminal control codes, see above
\033[00m      reset to normal output
\]            end encapsulation

\$            outputs "$" if a regular user, "#" when UID 0 (root)

\[...印刷されていない文字の改行が正しく行われていない場合、\]コマンドラインが端末の幅より長くなると、改行エラーが表示されます。

答え2

構文はPS1独自の言語なのでecho印刷できません。

これを学ぶには、シェルのドキュメントを見ることが唯一のオプションです。 https://www.gnu.org/software/bash/manual/html_node/Controlling-the-Prompt.html

答え3

PS1定義外の別のファイルに定義を配置すると、.bashrcファイルが保存されるたびにプロンプ​​トが更新されます。

例:

  • ファイルから.bashrc
    pcmd() {
      _error_value=$?;
      PS1=$(~/.pcmd $_error_value);
    }
    
    PROMPT_COMMAND=pcmd;
    
  • ホームディレクトリに新しいファイルを作成します.pcmd(実行可能でなければなりませんchmod a+x .pcmd)。
    #!/bin/bash
    _error_value=$1;
    _now=$(date +%H:%M);                                                                                       
    _error_r_time=$([ "$_error_value" != "0" ] && echo "[\[\e[1;37m\]>\[\e[1;31m\]$_error_value\[\e[1;37m\]<\[\e[m]\]" || echo "[\[\e[1;37m\]$_now\[\e[m\]");
    
    echo "[\[\e[1;32m\]\u\[\e[m\]@\[\e[1;36m\]\h\[\e[m\]](\[\e[1;32m\]\w\[\e[m\])$_error_r_time$ "
    

関連情報