
Причина, по которой мне нужно это сделать, заключается в том, что в моем PS1 должны быть «обновляемые» переменные. Я бы хотел, чтобы приглашение занимало всю ширину терминала, не переносясь и не переходя на новую строку. Для этого я уже нашел способ заставить его работать, но этот метод требует от меня перезагрузки bash каждый раз. Вот как я хочу, чтобы это выглядело:
|me::awesome| --------------------------------------------------------- ~/.config/awesome
$
После этого, когда я перейду в новый каталог, он будет выглядеть так:
|me::themes| -------------------------------------------------------------------------
------ ~/.config/awesome/themes
$
Но когда я затем бегу
exec bash
он успешно изменит все значения и будет выглядеть так:
|me::themes| --------------------------------------------------- ~/.config/awesome/themes
$
Поэтому я ищу способ включить изменяющиеся переменные в мою переменную PS1, которую я хотел бы обновлять каждый раз, когда вызывается новая подсказка. Вот как выглядит мой .bashrc на данный момент:
mytest=$PWD
mynext="$(basename $PWD)"
mylength=$((${#mytest}+${#mynext}))
length=$(($mylength+6))
PS1='|me::\W| $(printf "\\u2500%.0s" $(seq $length $(tput cols))) \w\n\$'
Я также попробовал поместить переменные в отдельный файл скрипта оболочки и запустить его на PS1, как показано ниже:
#/home/me/.PS1.sh
mytest=$PWD
mynext="$(basename $PWD)"
mylength=$((${#mytest}+${#mynext}))
length=$(($mylength+6))
echo "|me::\W| $(printf "\\u2500%.0s" $(seq $length $(tput cols))) \w\n\$"
#/home/me/.bashrc
PS1=$(/home/me/.PS1.sh)
решение1
Ваши переменные оцениваются только в первый раз, вы должны поместить их в ps1, чтобы они были обработаны буквально в первый раз и оценены после выполнения команды.
PS1='|me::\W| $( mytest=$PWD;mynext="${PWD##*/}"; mylength=$((${#mytest}+${#mynext})) ; length=$(($mylength+6)) ; printf "\\u2500%.0s" $(seq $length $(tput cols))) \w\n\$'
вы можете изменить только 6, если вы добавили что-то в ps1