
私がこれを可能にしなければならない理由は、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つだけ変更できます