シェル変数の内容をそのまま表示するにはどうすればよいですか?

シェル変数の内容をそのまま表示するにはどうすればよいですか?

ターミナルエスケープコードを含むDebianのシェル変数の内容をそのまま見たいです。echo内容を確認しようとすると、すべての端末エスケープが端末によって解釈され、色が表示されます。

➜  sds git:(master) echo $PS1
%(?:%{%}➜ :%{%}➜ ) %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)

シェル変数の内容をそのまま印刷できますか?それとも、内容をそのまま表示するには、変数を設定する正確なスクリプトを見つける必要がありますか?

答え1

ようにテルドン と言う、他の変数の値を使用して変数を設定した場合、その変数の元の設定を元に戻すことはできません。

しかし、少なくともBashとZshでは、端末やシェル自体で解釈されていない内容を見ることができます。

printf '%q\n' "$PS1"

これにより、他の効果を持つすべての文字がエスケープされます。これを使用して、逐語的な内容を再構成できます。

別のアプローチは、変数の内容を端末以外の場所に(直接)出力することです。

printf %s "$PS1" | od -vtc

変数の内容を文字単位で表示し、制御文字をニーモニック(、、nl... )に置き換えます。escsp

する〜いいえechoシーケンスを展開し\xて改行を追加するには、ここを使用してください。

あなたの場合

%(?:%{%}➜ :%{%}➜ ) %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)

変数の逐語的内容である可能性がありますPS1。端末で解釈されたエスケープがなく、オプションが設定されていると仮定すると、プロンプトを表示するために使用されるときに拡張されます。しかし、拡張されたときはそうではありません。fgreset_colorpromptsubstPS1echo $PS1

答え2

変数の内容には、使用しているすべての変数の拡張値が含まれます。ソースは値を拡張するためにのみ使用されるため、ソースに戻ることはできません。

たとえば、次のことを考えてみましょう。

fooVar="foo"
barVar="$fooVar : bar"

シェルが設定されているときはすでにに設定されておらず、に設定されていますbarVar。に戻る方法はありません。変数は、新しい変数に値として割り当てられる前に拡張されました。結局のところ、変数の使用のポイントは、変数を値として扱うことができるということです。$foovarbarVar$fooVar : barfoo : bar"$fooVar : bar"$vooVarbarVar

したがって、いいえ、すでに拡張して使用している「拡張されていない」変数をビンに戻す方法はありません。どの変数が使用されているかを確認する唯一の方法は、その変数を含むPS1さまざまなファイルを追跡することです。セット。

関連情報