So fügen Sie Bash-Skripte in die PS1-Variable ein

So fügen Sie Bash-Skripte in die PS1-Variable ein

Ich habe eine benutzerdefinierte PS1-Variable erstellt, die sehr verwirrend ist. Hier ist die Variable, die am ehesten funktioniert:

PS1="\n[\e[1;31m]\u@\H[\e[35m] \@ [\e[32m] PWD: \w [\e[1;34m]Dieser Ordner hat \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') Dateien [\e[1;33m]Insgesamt \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\n`if [ \$? = 0 ]; then echo [\e[32m]^_^ [\e[0m] Hat funktioniert - [\e[0m]; else echo [\e[31m]O_O[\e[0m]Hat nicht funktioniert - ; fi`"

Dies ist derselbe Code wie das vorherige Codebeispiel, er wurde jedoch zur besseren Lesbarkeit in Blöcke aufgeteilt und kommentiert:

#User@Host [Red]
\n\[\e[1;31m\]\u@\H

#Hour [Purple]
\[\e[35m\] \@ 

#PWD [Green]
\[\e[32m\] PWD: \w 

#Number of files in PWD [Blue]
\[\e[1;34m\]This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files 

#Amount of space the PWD files take, also line break [Yellow]
\[\e[1;33m\]A total of \$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\n

#Malfunctioning condition, should smile if the instruction went right, or poker-face if not [green and red]
\`if [ \$? = 0 ]; then echo \[\e[32m\]^_^ \[\e[0m\]\[\e[0m\]Worked - \[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\] Didn't worked - ; fi\`

Versuch, das Problem zu erklären:

  • ifsucht nach einer Bedingung, die nach der Ausführung von (eg.) nicht mehr falsch sein kann "This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files", da sie wahr ist, wenn die letzte Anweisung sauber beendet wurde.

Wie kann ich es zum Laufen bringen und gleichzeitig die Ausgabe an derselben Position belassen? Wenn das if vor den ersten ausgeführten Befehl verschoben wird, funktioniert es einwandfrei.

ifIch dachte daran , am Anfang von PS1 eine Variable mit dieser Bedingung zuzuweisen . Dann ifwürden andere an dieser Position die alternative Variable beurteilen, die sich nicht ändern würde. Aber leider habe ich überhaupt keine Erfahrung mit Bash. Ich habe es bereits ungefähr tausendmal erfolglos versucht.

Ungefähr so ​​(aber gut geschrieben):

PS1="`if [ \$? = 0 ];then echo "prev_err=0"; else prev_err=0; fi\` 
...[Some more code in between]...
`if [ \$prev_err = 0 ]
    then echo "No error"
    else echo "There was an error in the statement." 
fi\`"

Einige ` (Backtick-Zeichen) stehen an den falschen Stellen oder wurden im vorherigen Codeblock ausgelassen.

Antwort1

Das meiste davon erledigen Sie wahrscheinlich besser in PROMPT_COMMAND. Um das Bash-Handbuch zu zitieren: „Wenn festgelegt, wird der Wert als Befehl ausgeführt, bevor jede primäre Eingabeaufforderung ausgegeben wird.“

Siehe auchdieses riesige Beispiel.

Meins ist :-

PROMPT_COMMAND='history -a; history -n; printf "\e]1;${PWD}\a"'

Dadurch bleibt mein Verlauf über alle Terminalfenster hinweg synchronisiert.

Dann sollten Sie wahrscheinlich so viel wie möglich in Bash-Funktionen integrieren, um das Problem zu vereinfachen.

Übrigens - Sie werden vielleicht feststellen, du -sh .dass es etwas nützlicher und einfacher ist, als /bin/ls -lah | /bin/grep -m 1 totalnur die Dateinutzung abzurufen.

Antwort2

Meine Aufforderungenthält mehrere Funktionen, wie zum Beispiel

PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s \[$BOLD_FORMAT\] \[$ERROR_FORMAT\] $exit_code \[$RESET_FORMAT\] " ")'

Funktioniert das für dich?

verwandte Informationen