Если вывод команды не заканчивается на \n
, следующее приглашение появляется неловко сразу после:
$ echo -n hai
hai$
Я только что заметил коллегу, чья оболочка (zsh, для чего она стоит) настроена на печать %
(с фоном и передними цветами, инвертированными для выделения), а затем \n
в таких случаях:
$ echo -n hai
hai%
$
Я хотел бы сделать то же самое. Я использую Bash. Это возможно? Если да, то что бы я добавил в свой файл ~/.bashrc?
UPDATE
Я потратил несколько часов на то, чтобы понять, как работает gniourf_gniourf. Я поделюсь своими выводами здесь, если они будут полезны другим.
-
ESC[6n
- это интродуктор управляющей последовательности для доступа к позиции курсора./li > -
\e
не является допустимым представлением ESC при использованииecho
в OS X (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 -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}"
не нужна. Я включил его, чтобы этот код можно было использовать в контексте, в котором строка также актуальна.