从 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}" )