Aktualisieren Sie die „änderbaren“ Variablen bei jedem Aufruf von PS1, also bei jeder neuen Eingabeaufforderung

Aktualisieren Sie die „änderbaren“ Variablen bei jedem Aufruf von PS1, also bei jeder neuen Eingabeaufforderung

Der Grund, warum ich dies tun muss, ist, dass ich „aktualisierende“ Variablen in meiner PS1 haben möchte. Ich möchte, dass meine Eingabeaufforderung sich über die gesamte Breite des Terminals erstreckt und nicht umbricht oder in eine neue Zeile übergeht. Dafür habe ich bereits einen Weg gefunden, es zum Laufen zu bringen, aber diese Methode erfordert, dass ich Bash jedes Mal neu lade. So soll es aussehen:

|me::awesome| --------------------------------------------------------- ~/.config/awesome
$

Wenn ich danach in ein neues Verzeichnis wechsle, sieht es folgendermaßen aus:

|me::themes| -------------------------------------------------------------------------
------ ~/.config/awesome/themes
$

Aber wenn ich dann laufe

exec bash

Es werden alle Werte erfolgreich geändert und es sieht folgendermaßen aus:

|me::themes| --------------------------------------------------- ~/.config/awesome/themes
$

Ich suche also nach einer Möglichkeit, veränderliche Variablen in meine PS1-Variable zu integrieren, die jedes Mal aktualisiert werden soll, wenn eine neue Eingabeaufforderung aufgerufen wird. So sieht meine .bashrc im Moment aus:

mytest=$PWD
mynext="$(basename $PWD)"
mylength=$((${#mytest}+${#mynext}))
length=$(($mylength+6))
PS1='|me::\W| $(printf "\\u2500%.0s" $(seq $length $(tput cols))) \w\n\$'

Ich habe auch versucht, die Variablen in eine separate Shell-Skriptdatei zu setzen und diese wie folgt auf meiner PS1 auszuführen:

#/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)

Antwort1

Ihre Variablen werden nur beim ersten Mal ausgewertet. Sie müssen sie in PS1 einfügen, damit sie beim ersten Mal wörtlich behandelt werden und nach der Befehlsausführung ausgewertet werden.

PS1='|me::\W| $( mytest=$PWD;mynext="${PWD##*/}";  mylength=$((${#mytest}+${#mynext})) ; length=$(($mylength+6)) ; printf "\\u2500%.0s" $(seq $length $(tput cols))) \w\n\$'

Sie können nur 6 ändern, wenn Sie Sachen zu PS1 hinzugefügt haben

verwandte Informationen