Это особенность zsh
(и теперь fish
тоже), позволяющая вам четко видеть неопределенные строки в выводе команды.
В традиционных оболочках, если команда выводит некоторые данные после последнего символа новой строки, или, другими словами, если она оставляет курсор терминала не в начале строки, следующее приглашение оболочки завершается добавлением к этой последней неопределенной строке как в:
bash-4.4$ printf XXX
XXXbash-4.4$
Это искажает подсказку, и это легко пропустить, XXX
особенно если у вас есть такая необычная подсказка. Это также влияет на позиционирование курсора, что вызывает сбои дисплея при перемещении курсора.
zsh
обходит это, показывая, что вывод имеет неопределенную строку с %
символом в жирном и обратном видео, и выдает следующее приглашение в начале следующей строки:
zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$
Это достигается путем вывода этого обратного видео %
в конце каждой команды (перед каждым приглашением), за которым следуют 79 пробелов (при условии, что терминал шириной 80 символов), символ CR (тот, который заставляет курсор возвращаться к первому столбец) и последовательность, которую необходимо удалить до конца строки (а затем подсказка).
Таким образом, если была неопределенная строка, так как курсор находится не на первой позиции, эти 80 символов заставят курсор переместиться на следующую строку (и это %
останется). Если нет, то эти %
и те 79 пробелов будут в одной строке, которая будет впоследствии удалена.
Теперь это работает, только если терминал выполняет перенос строк (например, после этого он не будет работать должным образом tput rmam
). Если у вас медленный терминал (как, например, на последовательной линии 9600 бод), вы можете увидеть те, %
которые отображаются, а затем удаляются после каждой команды, поэтому zsh
вы можете отключить эту функцию:
unsetopt prompt_cr prompt_sp
Таким образом, zsh
ведет себя больше как традиционные оболочки.
Вы также можете изменить эту отметку с помощью $PROMPT_EOL_MARK
переменной.
print -n "this is a test"
тогдаprint "this is a test"