# Personalizzare Bash Il prompt di default della riga comandi di Linux può essere personalizzato facilmente modificando la variabile di ambiente PS1. `PS1="[stringa]"` La composizione della stringa nel comando PS1 determina come apparirà il prompt. ## Come visualizzare la stringa del prompt corrente Pe vedere la configurazione attuale del prompt basta digitare sulla riga comandi `ECHO $PS1` Sullo schermo viene visualizzata la stringa corrente, quella che definisce l'aspetto attuale del prompt. Ad esempio: ```bash echo $PS1 \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ``` ## Le principali opzioni Le principali opzioni per comporre la stringa sono le seguenti: - `\d` visualizza la data formato "Giorno-della-settimana Mese Data" ("Tue May 26"); - `\H` visualizza il nome dell'host; - `\t` visualizza l'ora nel formato a 24 ore ( HH:MM:SS); - `\A` visualizza l'ora nel formato a 24 ore ( HH:MM ); - `\u` visualizza il nome dell'utente corrente; - `\w` visualizza il nome della directory corrente o la tilde nel caso della directory $HOME; - `\$` visualizza il simbolo $ per gli utenti normali o # per l'utente root; - `\\` visualizza un singolo backslash; - `\n` il carattere "newline"; - `\r` il carattere "carriage return"; - `\s` il nome della shell, il nome base di $0; - `\!` il numero cronologico (history number) di questo comando; - `\[` comuncia una sequenza di caratteri non stampabili, che potrebbero essere usati per inserire una sequenza di controllo del terminale nel prompt; - `\]` termina la sequenza di caratteri non stampabili. Si possono anche utilizzare colori, icone e altri elementi grafici utilizzando codici di colore ANSI e icone speciali. Il formato è `\[\033[CODICE;COLOREm\]` ## Modificare la variabile $PS1 Per modificare la variabile PS1 si può usare il comando `export PS1="nuova stringa di prompt"` ad esempio `export PS1="\u@\h:\w$ "` visualizzerà il nome dell'utente, il nome del host e la directory corrente. ### Salvare le modifiche Per rendere permanenti le modifiche alla variabile PS1 si può aggiungere il comando export alla fine del file `.bashrc` presente nella home dell'utente. ```bash # codici dei colori DEFAULT="\[\033[0m\]" RED="\[\033[1;31m\]" GREEN="\[\033[0;32m\]" BLUE="\[\033[1;34m\]" EBLACK="\[\033[1;30m\]" PURPLE="\[\033[35m\]" YELLOW="\[\033[1;33m\]" CYAN="\[\033[1;36m\]" parse_git_branch() { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/' } export PS1="$GREEN[\A \d]$CYAN\u$BLUE@\h $DEFAULT(\!):$YELLOW\w $PURPLE\n\$(parse_git_branch)$DEFAULT > " ``` Riavviare il terminale o eseguire il comando `source ~/.bashrc` per rendere effettive le modifiche. La funzione `parse_git_branch` è una funzione personalizzata che consente di visualizzare il nome della branch corrente del repository git sulla riga di comando. In particolare: - `git branch 2> /dev/null`: esegue il comando git branch e reindirizza l'output di errore in `/dev/null`, in modo che non venga visualizzato alcun messaggio di errore se non si è in un repository git; - `sed -e '/^[^*]/d'`: utilizza sed per eliminare tutte le righe che non iniziano con un asterisco; - `-e 's/* \(.*\)/\1/'`: utilizza sed per sostituire la riga restante con solo il contenuto dopo l'asterisco (che è il nome della branch corrente). La funzione utilizzando questi comandi, restituirà solo il nome della branch corrente del repository git. ```bash [23:05 lun gen 16]davide@laptop (2000):~/Documenti/Appunti.wiki master > ``` ## Come avere una lunghezza indefinita della history ```bash # for setting history length see HISTSIZE and HISTFILESIZE in bash(1) HISTSIZE=-1 HISTFILESIZE=-1 ``` Basta impostare a `-1` questi valori nel file `.bashrc`. ## Ricerca nella history Per ricercare aventi e indietro nella cronologia dei comandi, mentre questi vengono digitati, tramite i tasti PAGUP e PAGDOWN, aggiungere il seguente testo nel file `~/.inputrc`: ```bash "\e[5~": history-search-backward "\e[6~": history-search-forward ``` I tasti `\e[5` e `\e[6` sono proprio PAGUP e PAGDOWN. In ogni caso, la pressione dei tasti CTRL+R permette di effettuare la ricerca ricorsiva dei comandi precedentemente digitati. ### Hstr `hstr` è un comando che aiuta a navigare in maniera più efficace nella history. Per installarlo basta digitare questo semplice comando: ```bash sudo apt install hstr ``` Ora, con la combinazione `CTRL+r` si accederà alla ricerca dei comandi. Hstr può essere configurato per fornire suggerimenti di ricerca durante la digitazione, simile ai suggerimenti che vengono visualizzati in genere in un browser Web e in altre applicazioni. Suggerisce i comandi utilizzati più spesso e li mantiene in cima alla lista. È inoltre possibile aggiungere manualmente i comandi ai preferiti per un accesso facile e veloce. Aggiungere il testo seguente al file `.bashrc` per la configurazione: ```bash # HSTR configuration - add this to ~/.bashrc alias hh=hstr # hh to be alias for hstr export HSTR_CONFIG=monochromatic # get more colors shopt -s histappend # append new history items to .bash_history export HISTCONTROL=ignorespace # leading space hides commands from history export PROMPT_COMMAND="history -a; history -n; ${PROMPT_COMMAND}" # if this is interactive shell, then bind hstr to Ctrl-r (for Vi mode check doc) if [[ $- =~ .*i.* ]]; then bind '"\C-r": "\C-a hstr -- \C-j"'; fi # if this is interactive shell, then bind 'kill last command' to Ctrl-x k if [[ $- =~ .*i.* ]]; then bind '"\C-xk": "\C-a hstr -k \C-j"'; fi ``` ## bash-completion ```bash sudo apt install bash-completion ``` Aggiungere quindi le righe sottostanti nel file `~/bashrc`: ```bash # Use bash-completion, if available [[ $PS1 && -f /usr/share/bash-completion/bash_completion ]] && \ . /usr/share/bash-completion/bash_completion # To get first completion and a listing you can add the following to bashrc bind 'set show-all-if-ambiguous on' bind 'TAB:menu-complete' ``` Mentre nel file `~/inputrc`: ```bash "\e[5~": history-search-backward "\e[6~": history-search-forward ``` in modo da avere il completamento della history coi tasti *pageup* e *pagedown*. ## Collegamenti - [https://linuxhint.com/bash-ps1-customization/](https://linuxhint.com/bash-ps1-customization/) - [http://www.megalab.it/5827/8/come-cambiare-il-prompt-di-bash](http://www.megalab.it/5827/8/come-cambiare-il-prompt-di-bash) - [http://www.pluto.it/sites/default/files/ildp/HOWTO/Bash-Prompt-HOWTO/Bash-Prompt-HOWTO-2.html](http://www.pluto.it/sites/default/files/ildp/HOWTO/Bash-Prompt-HOWTO/Bash-Prompt-HOWTO-2.html) - [https://linuxhint.com/hstr-command-history-browser-in-linux/](https://linuxhint.com/hstr-command-history-browser-in-linux/) - [https://github.com/scop/bash-completion](https://github.com/scop/bash-completion)