【问题标题】:Bash prompt does not convert escaped charactersBash 提示不转换转义字符
【发布时间】:2017-08-12 16:11:28
【问题描述】:

.profile 中的 bash 提示变量如下所示:

# $vars
# Always display last 2 directories of current path
current_dir() {
  pwd | awk -F\/ '{print $(NF-1),$(NF)}' | sed 's/ /\//g'
}
# Current git branch
parse_git_branch() {
   git branch 2> /dev/null | sed -e '/^[^​*]/d' -e 's/*​ \(.*\)/ (\1)/'
}

txtblk='\e[0;30m' # Black - Regular
txtred='\e[0;31m' # Red
txtgrn='\e[0;32m' # Green
txtylw='\e[0;33m' # Yellow
txtblu='\e[0;34m' # Blue
txtpur='\e[0;35m' # Purple
txtcyn='\e[0;36m' # Cyan
txtwht='\e[0;37m' # White
bldblk='\e[1;30m' # Black - Bold
bldred='\e[1;31m' # Red
bldgrn='\e[1;32m' # Green
bldylw='\e[1;33m' # Yellow
bldblu='\e[1;34m' # Blue
bldpur='\e[1;35m' # Purple
bldcyn='\e[1;36m' # Cyan
bldwht='\e[1;37m' # White
unkblk='\e[4;30m' # Black - Underline
undred='\e[4;31m' # Red
undgrn='\e[4;32m' # Green
undylw='\e[4;33m' # Yellow
undblu='\e[4;34m' # Blue
undpur='\e[4;35m' # Purple
undcyn='\e[4;36m' # Cyan
undwht='\e[4;37m' # White
bakblk='\e[40m'   # Black - Background
bakred='\e[41m'   # Red
badgrn='\e[42m'   # Green
bakylw='\e[43m'   # Yellow
bakblu='\e[44m'   # Blue
bakpur='\e[45m'   # Purple
bakcyn='\e[46m'   # Cyan
bakwht='\e[47m'   # White
txtrst='\e[0m'    # Text Reset

#           User      Current path (last 2 dirs)    Git branch          Switch to white color
export PS1="$txtcyn\u $txtpur\$(current_dir) $txtgrn\$(parse_git_branch)\[\033[00m\] \n\$ "

所以我的 bash 提示实际上应该显示我的用户名、当前目录和 git 分支(如果有的话),然后在新行中显示 $(就像上面评论的那样)。 但相反,它按字面意思显示字符串,而不像这样替换变量或转义字符:

我做错了什么?

编辑:我在 Mac 上使用 iTerm2

【问题讨论】:

  • 您是否参加了新会话或加载了新的 .profile,因为它看起来对我有用。
  • 是的。我试过source ~/.profile。我什至在.profile 文件的顶部声明了一个测试变量,并在采购后回显了它。那行得通。所以文件是最新的。
  • 顺便说一句,我正在使用 iTerm2。也许这有点相关。
  • 考虑安装最新版本的bash 并使用\WPROMPT_DIRTRIM 代替您的current_dir 函数。

标签: bash prompt iterm2


【解决方案1】:

您不能在硬引号 ('string') 中创建转义序列,它们总是按字面解释。

请改用双引号 ("string"),或尝试使用 ansi-c quoting ($'string')。

如果您选择坚持使用硬引号,您也可以一开始就避免转义。

【讨论】:

  • 这似乎只成功了一半。我用双引号替换了所有单引号,我的 bash 提示仍然如下所示:\e[0;36m\u \e[0;35m$(current_dir) \e[0;32m$(parse_git_branch)\[\033[00m\] \n$ 如果我 echo $PS1 它显示:$(current_dir) $(parse_git_branch)\[\] $ \e[0;36m\u \e[0;35m$(current_dir) \e[0;32m$(parse_git_branch)\[\033[00m\] \n$
  • 你绝对应该使用 ansi-c 引用,例如$'\033[9m'。为了在格式化输出字符串时使事情变得更容易,请查看styli.sh formatter。免责声明:我写的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多