У меня есть это в моем .bashrc
:
__PROMPT_NEWLINE=$'\nV '
__set_missing_newline_fix()
{
local CURPOS
echo -en "\E[6n" # ANSI DSR
read -sdR CURPOS
CURPOS=${CURPOS#*;}
if [ $CURPOS -eq 1 ]; then
__MISSING_NEWLINE_FIX=""
else
__MISSING_NEWLINE_FIX="$__PROMPT_NEWLINE"
fi
}
__set_prompt()
{
...
__set_missing_newline_fix
...
}
PROMPT_COMMAND=__set_prompt
PS1="\${__MISSING_NEWLINE_FIX}...rest of the prompt..."
Результат, в вашем случае, будет:
(base) user$ tail -2 ./file.txt
HWI-ST1410:141:C4WJLACXX:4:1201:18182:26815 + 7B 17611409 GTCGTTGTAGTATAGTGGTAAGTATTCCCGCCT
HW
V (base) user$
Что он делает, это запросить терминал на время создания подсказки ((base) user$
в вашем случае). Если курсор находится не в первом столбце, он начнет новую строку и добавит V
к приглашению (отсюда значение __PROMPT_NEWLINE
).
ANSI DSR равно Состояние устройства Отчет :
CSI 6n | DSR | Отчет о состоянии устройства | Сообщает приложению позицию курсора (как будто набрано на клавиатуре) ESC[n;mR
, где n - строка, а m - столбец.)
Итак, выполнив echo -en "\E[6n"
сразу после read -sdR CURPOS
(молча читается с символом R
в качестве разделителя), мы получаем значение ESC[n;m
.
CURPOS=${CURPOS#*;}
удаляет все до точки с запятой (;
), что по существу извлекает m
, номер столбца.
И, наконец, если столбец не 1, то мы знаем, что нам нужно исправить запрос, добавив __MISSING_NEWLINE_FIX
.