Titel: BASH PROMT_COMMAND
Beitrag von: Sebastian am 07. Oktober 2023, 11:29:45
Hallo Suletuxe,
Ich wollte mit asciinema (https://asciinema.org/) ein paar Tutorials aufnehmen. Bei viel mir auf nachdem ich die Aufnahmedatei kontrolliert habe, (Dies ist eine einfache JSON formatierte Datei) das vor meinen Promt immer ein anderer String zu sehen war, den ich bei mir im Terminal aber überhaupt nicht sehe.
Code:
[0.046629, "o", "\u001b]0;sebastian@NB-FUJITSU:~\u0007\u001b[?2004h[REC E0 ~]$ "]
|
|
Dabei sollte sich der Promt wie bei der Aufnahme auch zu sehen nur auf
Code:
Beschränken. Also habe ich ein wenig nachgeforscht woran das liegen könnte:
Zuerst habe ich natürlich die üblichen verdächtigen Kontrolliert, ob sich da Code befindet der meinen Promt beeinflusst (~/.bashrc, ~/.bash_profile ~./profile).
Nichts gefunden, nur meinen Code der von der ~/.bash_profile die ~/.bashrc lädt die wiederum meine Konfiguartionsdatei lädt mit meinen Anspassungen ~/.bash_myconfig die meine PS1 Variable (Prompt) anpasst.
Gut dachte ich mir, dann schaue ich mir mal die Systemkonfigurationsdateien zur Bash an, die vor meiner Konfigurationen im Heimatverzeichnis geladen werden. Und ich wurde in der Datei /etc/bash.bashrc fündig:
Code:
...
PS1='[\u@\h \W]\$ '
case ${TERM} in Eterm*|alacritty*|aterm*|foot*|gnome*|konsole*|kterm*|putty*|rxvt*|tmux*|xterm*) PROMPT_COMMAND+=('printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"')
;; screen*) PROMPT_COMMAND+=('printf "\033_%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"') ;; esac
...
|
|
Hier wird die PS1 Variable auch gesetzt die von meiner Konfiguration aus dem Homeverzeichnis gleich wieder überschrieben wird. Aber im case Statment entdeckte ich für mich noch eine Unbekanntes Array das mir sehr verdächtig aussah PROMPT_COMMAND und der printf Befehl sieht mir genau danach aus was in der Aufnahmedatei vor meinen eigentlichen Promt steht.
Also habe ich die Umgebungsvariable $TERM einmal geprüft ob das case Statement auch bei meinem Terminal greifen würde:
Code:
ja würde es. Den Übeltäter habe ich also schon mal gefunden. Jetzt intressiert mich natürlich wofür dieses PROMT_COMMAND array überhaupt da ist. Also das Handbuch von Bash aufgeschlagen und nach PROMT_COMMAND gesucht:
PROMPT_COMMAND If this variable is set, and is an array, the value of each set element is executed as a command prior to issuing each primary prompt. If this is set but not an array variable, its value is used as a command to execute instead. PROMPT_DIRTRIM If set to a number greater than zero, the value is used as the number of trailing directory components to retain when expanding the \w and \W prompt string escapes (see PROMPTING below). Characters removed are replaced with an ellipsis.
|
|
Ahh man kann damit also jedes Mal bevor der Promt von der Bash erzeugt wird, einen Befehl ausführen lassen. Das ist doch schon mal gut zu wissen, damit kann man bestimmt später noch was anfangen. Zudem stand genau dadurunter noch etwas nützliches das man mit der PROMPT_DIRTRIM Variable die Pfad länge im Prompt verkürzen kann. Falls man nicht immer den kompletten Pfad dort drine sehen möchte. Auch sehr nützlich zu wissen wie ich finde.
Da ich den Promt aber nur meinen Benutzer und auch nur dann geändert haben möchte, wenn ich asciinema starte, habe ich in meiner ~.bash_myconfig Datei nun folgendem Einzeiler hinzugefügt, der die Konfiguration aus der /etc/bash.bashrc überschreibt:
Code:
(( ${ASCIINEMA_REC} )) && unset PROMPT_COMMAND; PS1='[REC E$? \W]\$ '
|
|
Dazu muss man wissen das beim starten von asciinema die Umgebunsvariable ASCIINEMA_REC=1 gesetzt wird, und damit mein Code funktioniert. Somit greift die Anpassung, nur wenn ich asciinema starte.
Daran konnte ich wieder sehen wie wahnsinnig komplex ein Betriebssystem ist, und man unmöglich alles wissen kann, aber Linux mit seiner Offenheit dazu einlädt dies zu erkunden, wenn man möchte.
LG Sebastian |
Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe | Powered by YaBB SE
© 2001-2003, YaBB SE Dev Team. All Rights Reserved.
|