如果命令的输出不以 结尾\n
,那么接下来会尴尬地立即出现下一个提示:
$ echo -n hai
hai$
我刚刚注意到一位同事的外壳(zsh,值得一提)被配置为在这种情况下打印 a %
(背景和前景色倒置以强调),然后是 a :\n
$ echo -n hai
hai%
$
我也想这样做。我使用 Bash。这可能吗?如果是这样,我会在我的 ~/.bashrc 中添加什么?
更新
我花了几个小时来了解 gniourf_gniourf 的解决方案是如何工作的。我将在这里分享我的发现,以防它们对其他人有用。
ESC[6n
是用于访问光标位置的控制序列介绍器 ( http://en.wikipedia.org/wiki/ANSI_escape_code )。\e
echo
在 OS X ( https://superuser.com/q/33914/176942 )上使用时不是 ESC 的有效表示。\033
可以代替使用。IFS 是 Bash 的内部字段分隔符 ( http://tldp.org/LDP/abs/html/internalvariables.html#IFSREF )。
read -sdR
看起来像 的简写read -s -d -R
,但实际上“R”不是标志,它是( delimiter) 选项的值。为了避免混淆,-d
我决定改写。read -s -d R
双括号结构 ,
(( ... ))
允许算术扩展和评估 ( http://tldp.org/LDP/abs/html/dblparens.html )。
这是我的.bashrc中的相关片段:
set_prompt() {
# CSI 6n reports the cursor position as ESC[n;mR, where n is the row
# and m is the column. Issue this control sequence and silently read
# the resulting report until reaching the "R". By setting IFS to ";"
# in conjunction with read's -a flag, fields are placed in an array.
local curpos
echo -en '\033[6n'
IFS=';' read -s -d R -a curpos
curpos[0]="${curpos[0]:2}" # strip leading ESC[
(( curpos[1] > 1 )) && echo -e '\033[7m%\033[0m'
# set PS1...
}
export PROMPT_COMMAND=set_prompt
注意:该curpos[0]="${curpos[0]:2}"
行是不必要的。我将其包含在内,因此可以在行也相关的上下文中使用此代码。