Guida Pratica a PS1: personalizzazione del prompt in Bash

Ciao a tutti! Oggi ho deciso di imparare una volta per tutte cosa posso mettere nella variabile d’ambiente PS1, quella che viene stampata in console prima di ogni comando. Ho preso qualche appunto per me e ne è venuta fuori una piccola guida, anche per i colori, che vorrei condividere con voi.

PS1 - Informazioni Utili

  • \u : Nome utente.
  • \h : Nome host fino al primo punto (esempio: se l’host è ‘server.example.com’, mostrerà solo ‘server’).
  • \H : Nome host completo.
  • \w : Percorso completo della directory corrente.
  • \W : Basename della directory corrente (esempio: se ti trovi in ‘/home/user/project’, \W visualizzerà solo ‘project’).
  • \d : Data in formato abbreviato.
  • \t : Ora attuale nel formato 24 ore HH:MM:SS.
  • \T : Ora attuale nel formato 12 ore HH:MM:SS.
  • \@ : Ora attuale nel formato 12 ore AM/PM.
  • \! : Numero cronologico del comando.
  • \$ : Mostra # se utente root, $ se altro.

Esempio:

PS1='\u@\h \W \$ '

Questo esempio visualizzerà qualcosa come: utente@host directory_corrente $

Escape ANSI

\033 e \e sono due modi intercambiabili di rappresentare il carattere ANSI ‘ESC’ (Escape), che ha il valore ASCII 27.

  • \033 : Notazione ottale, usata nei terminali Unix e nei file di configurazione della shell.
  • \e : Un’altra notazione per rappresentare lo stesso carattere di escape ‘ESC’, utilizzato nei prompt della shell e negli script per formattare il testo.

PS1 - Colori

Sintassi:

\[\033[XX;YY;ZZm\]
  • \[ e \] : Racchiudono le sequenze di escape per assicurare che Bash calcoli correttamente la lunghezza del prompt.
  • \033 o \e : Inizio della sequenza di escape ANSI.
  • XX;YY;ZZm : Sequenza di controllo ANSI che specifica come formattare il testo.
    • XX : Attributi del testo.
    • YY : Colore del testo.
    • ZZ : Colore dello sfondo.
    • m : Chiude la sequenza di controllo ANSI (SGR - Select Graphic Rendition).

Valori per XX (Attributi del Testo):

  • 0: Resetta tutto al formato di default (nessun colore, nessun stile).
  • 1: Attiva il grassetto o aumenta l’intensità (bold).
  • 2: Attenua il colore (dim).
  • 4: Sottolineato (underline).
  • 5: Lampeggiante (blink, ma non sempre supportato da tutti i terminali).
  • 7: Inverti i colori (reverse video).
  • 8: Testo nascosto (hidden).
  • 9: Testo barrato (strikethrough).
  • 22: Disattiva il grassetto o il dim.
  • 24: Disattiva il sottolineato.
  • 25: Disattiva il lampeggio.
  • 27: Disattiva l’inversione dei colori.
  • 28: Disattiva il testo nascosto.
  • 29: Disattiva il testo barrato.

Range di Valori per YY (Colori del Testo) e ZZ (Colori dello Sfondo):

  • 30-37: Colori del testo standard

    • 30: Nero
    • 31: Rosso
    • 32: Verde
    • 33: Giallo
    • 34: Blu
    • 35: Magenta
    • 36: Ciano
    • 37: Bianco
  • 90-97: Colori del testo brillanti (Bright/High-intensity)

    • 90: Nero brillante
    • 91: Rosso brillante
    • 92: Verde brillante
    • 93: Giallo brillante
    • 94: Blu brillante
    • 95: Magenta brillante
    • 96: Ciano brillante
    • 97: Bianco brillante

Colori dello Sfondo (Background Colors)

  • 40-47: Colori dello sfondo standard

    • 40: Sfondo nero
    • 41: Sfondo rosso
    • 42: Sfondo verde
    • 43: Sfondo giallo
    • 44: Sfondo blu
    • 45: Sfondo magenta
    • 46: Sfondo ciano
    • 47: Sfondo bianco
  • 100-107: Colori dello sfondo brillanti (Bright/High-intensity)

    • 100: Sfondo nero brillante
    • 101: Sfondo rosso brillante
    • 102: Sfondo verde brillante
    • 103: Sfondo giallo brillante
    • 104: Sfondo blu brillante
    • 105: Sfondo magenta brillante
    • 106: Sfondo ciano brillante
    • 107: Sfondo bianco brillante

Esempio:

PS1='\[\033[1;32m\]\u@\h:\[\033[1;34m\]\w\[\033[0m\]\$ '

Questo visualizzerà il prompt con il nome utente e host in verde grassetto, e il percorso in blu.

3 Likes

Il tutto era nato per avere, anche in bash, il nome del branch.
Così, ho fatto la scoperta della funzione __git_ps1, fornita dall’installazione di git, che mostra il nome del branch nel formato: ’ (nome_branch)', se la directory in cui ci si trova è un repository. Viceversa, non torna nulla.

Così, ho deciso di modificare il PS1 originale di Pop!_OS, da così:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

a così:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00;32m\]$(__git_ps1)\[\033[00m\]\$ '

e raggiungere la pace dei sensi :laughing:

3 Likes

Figata,

ad una presentazione che avevo portato al linux day mi ero presentato proprio mostrando il valore di PS1 che usavo al tempo xD

In generale oltre alla modline di Emacs cerco di minimizzare le info che altrimenti mi confondo. Però è molto utile da conoscere e da customizzare.

Grazie per la condivisione!

1 Like

Super interessante e guida molto ben fatta … il discorso della funzione di git non lo conoscevo minimamente, io ne usavo una che mi ero fatto

function parse_git_dirty {
  [[ $(git status --porcelain 2> /dev/null) ]] && echo -e '\e[91m*\e[0m'
}

function parse_git_branch {
    git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/*\(.*\)/(\1$(parse_git_dirty))/" | tr -d ' '
}

Provando ho notato che, a me, non funziona cosi out of the box ma ho dovuto scaricare il file git_prompt.sh dal repo ufficiale di Git come specificato anche nalle guida

In oltre ha un sacco di feature che si possono abilitare tipo impostando ad un valore non nullo GIT_PS1_SHOWDIRTYSTATE ti segna se ci sono file unstaged * o staged +.

RISULTATO:

:muscle: