Я использую это, он переносится на несколько строк и отступов по длине, user@host
поэтому он предполагает, что ток PS1
эффективно ' \u@\h:\w$
'. Он не усекает путь и адаптируется к текущей ширине терминала. Он только разделяет путь /
, поэтому элегантно не обрабатывает действительно длинные каталоги (но сохраняет места для выделения / копирования). Это гарантирует, что у вас всегда будет как минимум 20 символов для ввода.
readonly _PS1="${PS1}" 2>/dev/null
function myprompt()
{
local IFS
local nn nb pbits xpwd="" ww=60 len=0 pp='\\w\$ '
local indent uh="${LOGNAME}@${HOSTNAME//.*/}"
test -n "$COLUMNS" && let ww=$COLUMNS-20 # may be unset at startup
PS1="${_PS1}"
if [ ${#PWD} -ge $ww ]; then
printf -v indent "%${#uh}s%s" " " "> " # indent strlen(user@host)
IFS=/ pbits=( $PWD ); unset IFS
nb=${#pbits[*]}
for ((nn=1; nn<nb; nn++)) {
if [ $(( $len + 1 + ${#pbits[$nn]} )) -gt $ww ]; then
xpwd="${xpwd}/...\n${indent}..."
len=0
fi
xpwd="${xpwd}/${pbits[$nn]}"
let len=len+1+${#pbits[$nn]}
}
# add another newline+indent if the input space is too tight
if (( ( ${#uh} + len ) > ww )); then
printf -v xpwd "${xpwd}\n%${#uh}s" " "
fi
PS1="${PS1/$pp/$xpwd}$ "
fi
}
PROMPT_COMMAND=myprompt
Это работает, убирая магию \w
(подходит только \w$
для этого) PS1
и заменяя ее $PWD
, затем оборачивая ее в виде простой строки символов. Он пересчитывает PS1
каждый раз исходное значение, которое сохраняется в нем _PS1
, это означает, что также сохраняются "невидимые" экранированные символы, моя полная строка исходного приглашения xterm
и приглашение, выделенное жирным шрифтом:
PS1="\[\033]0;\u@\h:\w\007\]\[$(tput bold)\]\u@\h\[$(tput sgr0)\]:\w$ "
И конечный результат в терминале 80 столбцов:
mr@onomatopoeia:~$ cd /usr/src/linux/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace
mr@onomatopoeia:/usr/src/linux/tools/perf/scripts/perl/Perf-Trace-Util/lib/...
> .../Perf/Trace$ _
Это работает с Bash-3.2, как printf -v var
используется. Из-за различных сложностей потребуется некоторая корректировка для других вариаций PS1
.
(Путь в строке заголовка xterm не оборачивается и не сокращается, что можно сделать, включив один из других ответов здесь в вышеуказанную функцию.)