Luk*_*kas 2 command-line bash prompt escape-characters
例子:
当我跑
echo -e "\[\033[;33m\][\t \u (\#th) | \w]$\[\033[0m\]"
Run Code Online (Sandbox Code Playgroud)
打印的响应是
\[\][ \u (\#th) | \w]$\[\]
Run Code Online (Sandbox Code Playgroud)
在第一个之后\[和最后\]一个之前的所有内容都是橙棕色。
但是,当我将命令提示符设置为
\[\033[;33m\][\t \u (\#th) | \w]$\[\033[0m\]
Run Code Online (Sandbox Code Playgroud)
命令提示符打印为
[21:55:17 {username} (89th) | {current directory path}]$
Run Code Online (Sandbox Code Playgroud)
整个命令提示符是橙棕色的。
总之,我的问题是:我能有一个命令提示符设计印刷(有echo,cat,less,等),就好像它是命令提示符?
在 Bash 4.4+ 中,您可以使用${var@P},类似于如何${var@Q}生成var引用的内容,请参阅手册中的3.5.3 Shell 参数扩展,页面底部。
$ 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
Run Code Online (Sandbox Code Playgroud)
或者,如果您在没有 的情况下运行后者od,您应该会看到当前路径为绿色。
请注意,它打印\001and \002for \[and \]。这些对你来说可能不太有用。我们可以使用临时变量和字符串替换扩展来摆脱它们:
$ 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
Run Code Online (Sandbox Code Playgroud)
在 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%.<
Run Code Online (Sandbox Code Playgroud)
和参数扩展标志%,因此${(%)var}类似于${var@P}上面的Bash ,您可以使用print -v othervar -P "..."或othervar=${(%)var}将结果字符串放入othervar.
请注意,对于 Bash 的\uand 之类的东西\w,您可以只使用$USERand$PWD代替,但对于类似\#或\j那样的东西,可能并不那么容易。
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |