20

質問は簡単です。PS1bash スクリプトの現在の値を評価したいと考えています。

グーグルのすべての資料は、それを改善するためのチュートリアルを指していますが、現在の端末、または少なくとも一部の端末でどのようにレンダリングされるかを評価したいと思います。

それを達成するのに役立つソフトウェア/機能はありますか? もちろん、すべてのエスケープ文字を評価したいのでecho $PS1、私の場合はそれほど役に立ちません。

4

6 に答える 6

4

scriptユーティリティ(bsdutilsubuntuのパッケージの一部)を使用して、もう1つの可能性:

$ TEST_PS1="\e[31;1m\u@\h:\n\e[0;1m\$ \e[0m"
$ RANDOM_STRING=some_random_string_here_that_is_not_part_of_PS1
$ script /dev/null <<-EOF | awk 'NR==2' RS=$RANDOM_STRING
PS1="$TEST_PS1"; HISTFILE=/dev/null
echo -n $RANDOM_STRING
echo -n $RANDOM_STRING
exit
EOF
<prints the formatted prompt properly here>

scriptコマンドは指定されたファイルを生成し、出力は stdout にも表示されます。filename を省略すると、typescript というファイルが生成されます。

この場合、ログ ファイルには関心がないため、ファイル名は として指定され/dev/nullます。代わりに、スクリプト コマンドの stdout が awk に渡され、さらに処理されます。

  1. コード全体を関数にカプセル化することもできます。
  2. また、出力プロンプトを変数に割り当てることもできます。
  3. PROMPT_COMMANDこのアプローチは、 ...の解析もサポートしています。

編集:
の新しいバージョンは、typescript でscriptパイプされたものをエコーするようです。stdinこれを処理するには、上記のメカニズムを次のように変更できます。

$ TEST_PS1="\e[31;1m\u@\h:\n\e[0;1m\$ \e[0m"
$ RANDOM_STRING=some_random_string_here_that_is_not_part_of_PS1
$ script /dev/null <<-EOF | awk '{old=current; current=$0;} END{print old}' RS=$RANDOM_STRING
PS1="$TEST_PS1"; HISTFILE=/dev/null
alias $RANDOM_STRING=true
$RANDOM_STRING
$RANDOM_STRING
EOF

<prints the formatted prompt properly here>

説明:

これらのコマンドを端末で手動で入力してみてください。これらのコマンドをそのまま下にコピーheredocし、マウスの中クリックで貼り付けます。スクリプト コマンドの stdout には、非常によく似たものが含まれます。

たとえば、上記の場合、スクリプト コマンドの出力は次のようになります。

PS1="\e[31;1m\u@\h:\n\e[0;1m$ \e[0m"; HISTFILE=/dev/null
alias some_random_string_here_that_is_not_part_of_PS1=true
some_random_string_here_that_is_not_part_of_PS1
some_random_string_here_that_is_not_part_of_PS1
 \e[0m"; HISTFILE=/dev/nullhsane-dev : ~/Desktop $ PS1="\e[31;1m\u@\h:\n\e[0;1m$ 
anishsane@anishsane-dev:
$ alias some_random_string_here_that_is_not_part_of_PS1=true
anishsane@anishsane-dev:
$ some_random_string_here_that_is_not_part_of_PS1
anishsane@anishsane-dev:
$ some_random_string_here_that_is_not_part_of_PS1
anishsane@anishsane-dev:
$ exit

「some_random_string_here_that_is_not_part_of_PS1」を区切り文字 (awk のレコード区切り文字) として stdout を分割し、最後から 2 つ後のレコードを出力します。

EDIT2:

別のメカニズム (bash ソース コードと gdb を使用):

$ gdb -batch -p $$ -ex 'call bind_variable("expanded_PS1", decode_prompt_string (get_string_value ("PS1")), 0)'
$ echo "$expanded_PS1"
<prints the formatted prompt properly here>
  1. ただし、ここには小さな問題があります。\[またはの\]文字列は、それぞれ/PS1として出力されます。でそれらを削除できます\1\2tr -d '\1\2' <<< "$expanded_PS1"
  2. プロセスへのアタッチに失敗したようなエラーが発生gdbした場合 (ubuntu :-\ で発生するようです)、 で実行gdbsudoます。
于 2014-03-11T11:37:56.553 に答える
-1

/etc/bashrc ファイルを編集します

これを例として使用して、出力を確認できます

    # If id command returns zero, you’ve root access.
if [ $(id -u) -eq 0 ];
then # you are root, set red colour prompt
  PS1="\\[$(tput setaf 1)\\]\\u@\\h:\\w #\\[$(tput sgr0)\\]"
else # normal
  PS1="[\\u@\\h:\\w] $"
fi
于 2014-03-11T10:31:06.323 に答える