如何扩展PS1?

2023-12-02

我有一个 shell 脚本,它在多个目录中运行相同的命令(fgit)。对于每个目录,我希望它显示当前的提示符+将在那里运行的命令。如何获取对应的字符串decoded(扩展)PS1?例如我的默认PS1是

${debian_chroot:+($debian_chroot)}\[\e[1;32m\]\u\[\e[0m\]@\[\e[1;32m\]\h\[\e[0m\]:\[\e[1;34m\]\w\[\e[0m\]$(__git_ps1 ' (%s)')$

我想回应结果提示username@hostname:/path$,最好(但不一定)具有漂亮的颜色。粗略地浏览一下 Bash 手册并没有给出任何明确的答案,并且echo -e $PS1仅评估颜色。


从 Bash 4.4 开始你可以使用@P扩张:

首先,我将提示字符串放入变量中myprompt using read -r以及此处引用的文档:

read -r myprompt <<'EOF'
${debian_chroot:+($debian_chroot)}\[\e[1;32m\]\u\[\e[0m\]@\[\e[1;32m\]\h\[\e[0m\]:\[\e[1;34m\]\w\[\e[0m\]$(__git_ps1 ' (%s)')$ 
EOF

打印提示(因为它会被解释为PS1),使用扩展${myprompt@P}:

$ printf '%s\n' "${myprompt@P}"
gniourf@rainbow:~$
$

(其实有一些\001 and \002人物,来自\[ and \]您在这里看不到它们,但如果您尝试编辑这篇文章,则可以看到它们;如果您键入命令,您还会在终端中看到它们)。


为了摆脱这些,Dennis Williamson 在 bash 邮件列表上发送的技巧是使用read -e -p以便 readline 库解释这些字符:

read -e -p "${myprompt@P}"

这将提示用户,myprompt正确解释。

对于这篇文章,格雷格·伍利奇 (Greg Wooledge) 回答说,你不妨剥掉\001 and \002从字符串中。这可以像这样实现:

myprompt=${myprompt@P}
printf '%s\n' "${myprompt//[$'\001'$'\002']}"

对于这篇文章,Chet Ramey 回答说,您也可以使用以下命令完全关闭行编辑set +o emacs +o vi。所以这也可以:

( set +o emacs +o vi; printf '%s\n' "${myprompt@P}" )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何扩展PS1? 的相关文章