Bash prompt s Kubernetes kontextem a git větví

Git, Linux, Tipy & triky

Jako vše v Linuxu jde měnit, i ta část v příkazové řádce před dolarem, která se nazývá prompt jde upravit. A někdy se to může opravdu hodit. Doplnit či přepsat lze cokoli člověka napadne, a může mu to tak ulehčit práci a zobrazovat informace, které jsou pro něj důležité.

Bash prompt s Kubernetes kontextem a git větví

Níže je uveden obsah proměnné $PS1, která právě určuje co se zobrazí v záhlaví terminálu a také v bash promptu, neboli té části před $. Přidáno je i vysvětlení jednotlivých částí, protože vyznat se v této změti znaků není vůbec jednoduché.

\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$

# Vysvětlení jednotlivých částí
\[\e]0; # Escape sekvence a 0; určuje počátek textu, který se zobrazí v záhlaví terminálu
\u@\h: \w\a\] # V záhlaví terminálu je uživatel@hostname: aktuální složka, \a je BEL, který určí konec
${debian_chroot:+($debian_chroot)} # Pokud je aktuálně uživatel v prostředí chroot, je zde zobrazeno
\[\033[01;32m\]\u@\h\[\033[00m\] # Jinou barvou vypsán uživatel@hostname
:\[\033[01;34m\]\w\[\033[00m\]\$ # Dvojtečka následována aktuálním adresářem opět jinou barvou

Změnit proměnnou $PS1 lze jednoduše v souboru ~/.bashrc a vložit do ní cokoli je potřeba. Na stránkách ss64.com je seznam proměnných a barev, které lze použít. Existuje dokonce i generátor, kterým lze obsah vygenerovat v jednoduchém klikátku. Barvy ale prozatím neumí.

Já raději místo přepisování celého promptu využil nahrazení. V souboru .bashrc se celý prompt skládá na základě různých podmínek. Takže mám zajištěno, že si nepřepíšu něco, co nechci. Následující řádek jsem vložil úplně na konec souboru .bashrc. Díky za tip Michalovi s tučňákem.

# Nahrazení v proměné PS1, nahrazuje se "@\h[" za "@🐧["
PS1="${PS1/@\\h\\[/@🐧\\[}"

Přidání Kubernetes kontextu a git větve do promptu

V práci se často připojuji přes Kubernetes do několika různých prostředí. Někdy je velmi jednoduché se napříč více terminály splést, ve kterém kontextu se právě nacházím. Něco podobného lze si říct i o gitu a jeho větvích. Níže uvedený kód je opět přidaný na konec .bashrc souboru. Do promptu přidá jak Kubernetes kontext tak aktuální větev gitu, pokud existuje.

prompt_k8s(){
  k8s_current_context=$(kubectl config current-context 2> /dev/null)
  if [[ $? -eq 0 ]] ; then echo -e "${k8s_current_context}"; fi
}
# V proměnné PS1 se nahradí ":\[" za ">\[\e[1;33m\]$(prompt_k8s)\e[0m\]:\["
PS1="${PS1/:\\[/>\\[\\e[1;33m\\]\$(prompt_k8s)\\[\\e[0m\\]:\\[}"

prompt_git_branch(){
  git_branch=$(git branch 2> /dev/null | grep \* | cut -d ' ' -f2)
  if [[ $? -eq 0 && ! -z "$git_branch" ]] ; then echo -e " [${git_branch}]"; fi
}
# V proměnné PS1 se nahradí "\$" za "\e[0;36m$(prompt_git_branch)\e[0m\]\$"
PS1="${PS1/\\$/\\[\\e[0;36m\\]\$(prompt_git_branch)\\[\\e[00m\\]\\$}"

Zapnutí změny promptu příkazem

Pokud se výše uvedený skript vloží na konec souboru .bashrc, je spuštěn při otevření terminálu. Já se rozhodl si Kubernetes kontext zobrazovat jen, když je opravdu potřeba. Nevýhodou ale je, že proměnnou $PS1 nelze změnit ze skriptu, protože poté je brána jako lokální proměnná.

Existuje ale způsob, jak to obejít. Je potřeba vytvořit skript ~/k8s-show-context, který obsahuje kód jak je uveden výše. Aby se spustil globálně a mohl přepsat proměnnou $PS1, spustí se  příkazem source. Ten vrací přímo zdrojový kód, který je poté spuštěn, jakoby byl napsán přímo do konzole. Následující řádek stačí vložit do souboru ~/.bash_aliases. Skript se spustí zadáním aliasu k8s-context, který kód spustí a změní proměnnou PS1 až do zavření terminálu.

alias k8s-context="source ~/k8s-show-context"

Vlastní zkušenosti s přepisováním promptu můžete sdílet s ostatními v komentářích.

K tomuto článku již není možné přidávat další komentáře