我需要能够做到这一点的原因是要在我的 PS1 中“更新”变量。我希望我的提示跨越终端的整个宽度,而不是环绕或向下到新行。为此,我已经找到了一种让它工作的方法,但这种方法需要我每次都重新加载 bash。我希望它看起来像这样:
|me::awesome| --------------------------------------------------------- ~/.config/awesome
$
之后,当我 cd 进入新目录时,它将如下所示:
|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\$'
我还尝试将变量放入单独的 shell 脚本文件中,并在我的 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\$'
如果你向 ps1 添加了内容,则只能更改 6