如果命令的输出没有以 \n
结尾,那么下一个提示符会尴尬地立即出现:
$ echo -n hai
hai$
我刚刚注意到一个同事的shell(zsh,如果有用的话)被配置为在这种情况下打印一个%
(背景和前景颜色反转以强调),然后是一个\n
:
$ echo -n hai
hai%
$
我也想这样做。我使用Bash。这可行吗?如果可以,我应该在我的~/.bashrc文件中添加什么内容?
更新
我花了几个小时来理解gniourf_gniourf的解决方案。我将在此分享我的发现,以便对其他人有用。
ESC[6n
是用于访问光标位置的控制序列引导符(http://en.wikipedia.org/wiki/ANSI_escape_code)。\e
在OS X上使用echo
时不是ESC的有效表示方式(https://superuser.com/q/33914/176942)。可以使用\033
代替。IFS是Bash的内部字段分隔符(http://tldp.org/LDP/abs/html/internalvariables.html#IFSREF)。
read -sdR
看起来像read -s -d -R
的缩写,但实际上,"R"不是标志,而是-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}"
行是不必要的。我将其包含在内,以便这段代码可在需要相关行数的上下文中使用。
~/.zshrc
中的代码片段很可能与您的~/.bashrc
中的相同。这个问题可能更适合 Server Fault,但如果您只想追加到没有 \n 换行符的行上,那么这个问题也可以回答。 - MattSizzle\n
结尾的输出。 - davidchambersexec zsh
。 - Kevin$COLUMN - 1
spaces then\r
trick,如果有人仍然好奇为什么他们找不到它在他们朋友的.zshrc文件中。 - Tomáš Janoušek