質問は簡単です。PS1
bash スクリプトの現在の値を評価したいと考えています。
グーグルのすべての資料は、それを改善するためのチュートリアルを指していますが、現在の端末、または少なくとも一部の端末でどのようにレンダリングされるかを評価したいと思います。
それを達成するのに役立つソフトウェア/機能はありますか? もちろん、すべてのエスケープ文字を評価したいのでecho $PS1
、私の場合はそれほど役に立ちません。
script
ユーティリティ(bsdutils
ubuntuのパッケージの一部)を使用して、もう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 に渡され、さらに処理されます。
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>
\[
またはの\]
文字列は、それぞれ/PS1
として出力されます。でそれらを削除できます\1
\2
tr -d '\1\2' <<< "$expanded_PS1"
gdb
した場合 (ubuntu :-\ で発生するようです)、 で実行gdb
しsudo
ます。/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