Wie füge ich Bash-Skripte in die PS1-Variable ein?

2296
SOMN

Ich habe eine benutzerdefinierte PS1-Variable erstellt, was sehr verwirrend ist. Hier ist derjenige, der einer vollen Arbeit am nächsten kommt:

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: :: g ') Dateien [\ e [1; 33m] Eine Gesamtzahl von \ $ (/ bin / ls -lah | / bin / grep -m 1 total | / bin / sed 's / total //') b \ n`if [\ $? = 0]; dann echo [\ e [32m] ^ _ ^ [\ e [0m ] Arbeitete - [\ e [0m]; sonst Echo [\ e [31m] O_O [\ e [0m] Hat nicht funktioniert -; fi` "

Dies ist derselbe Code wie im vorherigen Codebeispiel, aber er wurde 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 dem Ausführen (z. B.) nicht mehr falsch sein kann "This folder has \$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files", da es wahr ist, wenn die letzte Anweisung ein sauberes Ende hatte.

Wie kann ich es funktionieren lassen und gleichzeitig die Ausgabe in derselben Position halten? Wenn das if vor dem ersten ausgeführten Befehl verschoben wird, funktioniert es einwandfrei.

Ich dachte daran if, zu Beginn der PS1 eine Variable mit dieser Bedingung zuzuweisen. Dann würde ein anderer ifan dieser Position die alternative Variable beurteilen, die sich nicht ändern würde. Aber leider habe ich mit Bash überhaupt keine Fähigkeiten. Ich habe bereits tausendmal versucht, es erfolglos zu tun.

So etwas (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) sind an den falschen Stellen oder im vorherigen Codeblock nicht vorhanden.

2

2 Antworten auf die Frage

3
Tony Williams

In PROMPT_COMMAND ist es wahrscheinlich am besten, wenn Sie das Bash-Handbuch zitieren: "Wenn gesetzt, wird der Wert vor der Ausgabe jeder primären Eingabeaufforderung als Befehl ausgeführt."

Siehe auch dieses riesige Beispiel .

Meins ist :-

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

das hält meine Geschichte über Terminalfenster synchronisiert.

Dann sollten Sie wahrscheinlich so viel wie möglich innerhalb der bash-Funktionen einsetzen, um das Problem zu vereinfachen.

Übrigens - Sie finden vielleicht du -sh .etwas nützlicher und einfacher als /bin/ls -lah | /bin/grep -m 1 totalnur die Dateiverwendung zu erlangen

Ich habe alles geliebt, was ich gesehen habe, wohlgemerkt (besonders das verknüpfte, riesige Beispiel), aber der letzte Teil hört sich an, als könnte dies zu schweren Verzögerungen führen. Das Timing eines "du -sh." In $ HOME kostete beispielsweise _real 0m34.018s_ und hatte 4 _du: ./Library / ...: Berechtigung verweigert 'diagnostics_. Timing der letztere Fall _real 0m0.006s_ - kaum wahrnehmbar. Billy McCloskey vor 10 Jahren 0
2
l0b0

Meine Eingabeaufforderung enthält mehrere Funktionen, z

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

Funktioniert das für dich?