PS1 が呼び出されるたびに、つまり新しいプロンプトごとに「変化する」変数を更新します

PS1 が呼び出されるたびに、つまり新しいプロンプトごとに「変化する」変数を更新します

私がこれを可能にしなければならない理由は、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\$'

また、次のように、変数を別のシェル スクリプト ファイルに入れて、それを 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

変数は最初の 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つだけ変更できます

関連情報