シェルプロンプトで使用されるエスケープコードは、エコーなどの他の場所で使用できますか?

シェルプロンプトで使用されるエスケープコードは、エコーなどの他の場所で使用できますか?

例:

  • 私が走るとき

    echo -e "\[\033[;33m\][\t \u (\#th) | \w]$\[\033[0m\]"
    

    印刷された応答は次のとおりです。

    \[\][    \u (\#th) | \w]$\[\]
    

    最初から最後までの\[すべては\]オレンジ茶色です。

  • ただし、コマンドプロンプトを次のように設定すると、

    \[\033[;33m\][\t \u (\#th) | \w]$\[\033[0m\]
    

    コマンドプロンプトは次のように印刷されます。

    [21:55:17 {username} (89th) | {current directory path}]$
    

    完全なコマンドプロンプトはオレンジ - 茶色です。

とにかく私の質問は次のとおりです。コマンドプロンプトデザイン(などecho)をコマンドプロンプトであるかのように印刷できますか?catless

ベストアンサー1

Bash 4.4+では、引用したコンテンツを生成する${var@P}方法と同様に使用できます。${var@Q}var3.5.3 シェルパラメータの拡張マニュアルページの下部にあります。

$ printf "%s\n" "${var}" 
\[\033[00;32m\]\w\[\033[00m\]\$
$ printf "%s\n" "${var@P}"  |od -tx1z
0000000 01 1b 5b 30 30 3b 33 32 6d 02 2f 74 6d 70 01 1b  >..[00;32m./tmp..<
0000020 5b 30 30 6d 02 24 0a                             >[00m.$.<
0000027

またはなしで後者を実行している場合は、od現在のパスを緑色で表示する必要があります。

and for andを印刷します\001。これらはあなたにとってあまり役に立たないかもしれません。一時変数と文字列置換拡張を使用してそれらを削除できます。\002\[\]

$ printf -v pst "%s\n" "${var@P}" 
$ pst=${pst//[$'\001\002']}
$ printf "%s\n" "$pst" |od -tx1z
0000000 1b 5b 30 30 3b 33 32 6d 2f 74 6d 70 1b 5b 30 30  >.[00;32m/tmp.[00<
0000020 6d 24 0a 0a                                      >m$..<
0000024

Zshには次のものがありますprint -P

$ print -P "%F{green}%d%F{normal}%#" |od -tx1z
0000000 1b 5b 33 32 6d 2f 74 6d 70 2f 61 61 61 1b 5b 33  >.[32m/tmp/aaa.[3<
0000020 39 6d 25 0a                                      >9m%.<

とパラメータ拡張フラグは上記のBashと似ている%ので、結果の文字列を。${(%)var}${var@P}print -v othervar -P "..."othervar=${(%)var}othervar


\uBashのような場合はandを代わりに\w使用できますが、orの場合は簡単ではないかもしれません。$USER$PWD\#\j

おすすめ記事