PS1が呼び出されるたびに、つまりすべての新しいプロンプトが呼び出されるたびに "change"変数を更新します。

PS1が呼び出されるたびに、つまりすべての新しいプロンプトが呼び出されるたびに "change"変数を更新します。

私がこれを行うことができる理由は、私の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

変数は最初にのみ評価されるため、最初は文字通り処理され、コマンドが実行された後に評価されるように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つだけ変更できます。

関連情報