Bash (Italiano)/Prompt customization (Italiano)

From ArchWiki

Tango-preferences-desktop-locale-modified.pngThe translation of this article or section does not reflect the original text.Tango-preferences-desktop-locale-modified.png

Reason: No major updates since 2012, a light touch up has been done 2020-01 (Discuss in Talk:Bash (Italiano)/Prompt customization (Italiano))

Esistono varie possibilità per il proprio prompt di bash e personalizzarlo aiuterà ad essere più produttivi dalla riga di comando. Si possono aggiungere informazioni al prompt, o semplicemente colorarlo per farlo risaltare.

Prompt basilari

Le seguenti impostazioni sono utili per distinguere il prompt di root da quello di utente normale.

  • Editare il file di configurazione personale di Bash:
$ nano ~/.bashrc
  • Decommentare il prompt di default:
#PS1='[\u@\h \W]\$ '
  • Aggiungere il seguente prompt verde per gli utenti normali:
[chiri@zetsubou ~]$ _
PS1='\[\e[1;32m\][\u@\h \W]\$\[\e[0m\] '
  • Editare il file .bashrc per root; copiarlo da /etc/skel in caso non sia già presente:
# nano /root/.bashrc
  • Assegnare il prompt rosso per root:
[root@zetsubou ~]# _
PS1='\[\e[1;31m\][\u@\h \W]\$\[\e[0m\] '

Prompt un po' più elaborati

  • Un prompt verde e blu per utenti normali:
chiri ~/docs $ echo "sample output text" sample output text chiri ~/docs $ _
PS1='\[\e[0;32m\]\u\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \[\e[1;32m\]\$\[\e[m\] \[\e[1;37m\]'

Questo visualizzerà un prompt molto piacevole, colorato con un colore di testo bianco brillante.

La stringa sopra contiene le impostazioni colore per le sequenze di escape (inizio colorazione: \[\e[color\], fine colorazione: \[\e[m\]) e le informazioni segnaposto:

  • \u - Nome utente. Il prompt originale ha anche \h, che stampa il nome dell'host.
  • \w - Attuale percorso assoluto. Usa \W per l'attuale percorso relativo percorso.
  • \$ - Il carattere di prompt (es.# per root,$ per gli utenti normali).

L'ultimo sequenza di colore, \[\e[1;37m\], non è chiusa, in modo che il testo rimanente (tutto quello che è scritto nel terminale, l'output dei programmi e così via) saranno in quel colore (bianco brillante). Può essere auspicabile cambiare questo colore, o cancellare l'ultima sequenza di escape in modo da lasciare l'attuale output con colori inalterati.

  • Un prompt rosso e blu per root:
root ~/docs # echo "sample output text" sample output text root ~/docs # _
PS1='\[\e[0;31m\]\u\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \[\e[0;31m\]\$ \[\e[m\]\[\e[0;32m\]'

Questo darà una denominazione rossa con il testo della console verde.

Una volta effettuate le modifiche al bashrc, per applicare le modifiche.:

$ source ~/.bashrc

Prompt avanzati

Caricamento Stato della memoria per 256 colori

Questo non è nemmeno superare i limiti... altro che utilizzare sed per analizzare memoria e carico medio (usando l'opzione -u per il non-buffering), oppure l'arrangiamento per salvare la cronologia al proprio "HISTFILE" dopo ogni comando. Queste soluzioni sono estremamente utili quando si tratta di crash di shell o subshell, ed essenzialmente si tratta solo di far stampare a Bash variabili già note, rendendo l'operazione estremamente veloce rispetto al prompt con i comandi builtin.

Questo prompt è tratto dall'articolo di AskApache.com, BASH Power Prompt article, che fornisce maggiore approfondimenti. È particolarmente utile per coloro che vogliono comprendere i terminali a 256 colori, ncurses, termcap e terminfo.

Questo è per terminali a 256 colori, che è da dove provengono gli escape \033[38;5;22m.

802/1024MB      1.28 1.20 1.13 3/94 18563
[5416:17880 0:70] 05:35:50 Wed Apr 21 [[email protected]:/dev/pts/0 +1] ~
(1:70)$ _
 PROMPT_COMMAND='history -a;echo -en "\033[m\033[38;5;2m"$(( `sed -nu "s/MemFree:[\t ]\+\([0-9]\+\) kB/\1/p" /proc/meminfo`/1024))"\033[38;5;22m/"$((`sed -nu "s/MemTotal:[\t ]\+\([0-9]\+\) kB/\1/Ip" /proc/meminfo`/1024 ))MB"\t\033[m\033[38;5;55m$(< /proc/loadavg)\033[m"'
 PS1='\[\e[m\n\e[1;30m\][$$:$PPID \j:\!\[\e[1;30m\]]\[\e[0;36m\] \T \d \[\e[1;30m\][\[\e[1;34m\]\u@\H\[\e[1;30m\]:\[\e[0;37m\]${SSH_TTY} \[\e[0;32m\]+${SHLVL}\[\e[1;30m\]] \[\e[1;37m\]\w\[\e[0;37m\] \n($SHLVL:\!)\$ '

Lista di colori per il prompt e Bash

Aggiungere questo al file di Bash per definire i colori per il prompt e i comandi:

txtblk='\e[0;30m' # Nero - Regular
txtred='\e[0;31m' # Rosso
txtgrn='\e[0;32m' # Verde
txtylw='\e[0;33m' # Giallo
txtblu='\e[0;34m' # Blu
txtpur='\e[0;35m' # Viola
txtcyn='\e[0;36m' # Ciano
txtwht='\e[0;37m' # Bianco
bldblk='\e[1;30m' # Nero - Bold
bldred='\e[1;31m' # Rosso
bldgrn='\e[1;32m' # Verde
bldylw='\e[1;33m' # Giallo
bldblu='\e[1;34m' # Blu
bldpur='\e[1;35m' # Viola
bldcyn='\e[1;36m' # Ciano
bldwht='\e[1;37m' # Bianco
undblk='\e[4;30m' # Nero - Underline
undred='\e[4;31m' # Rosso
undgrn='\e[4;32m' # Verde
undylw='\e[4;33m' # Giallo
undblu='\e[4;34m' # Blu
undpur='\e[4;35m' # Viola
undcyn='\e[4;36m' # Ciano
undwht='\e[4;37m' # Bianco
bakblk='\e[40m'   # Nero - Background
bakred='\e[41m'   # Rosso
badgrn='\e[42m'   # Verde
bakylw='\e[43m'   # Giallo
bakblu='\e[44m'   # Blu
bakpur='\e[45m'   # Viola
bakcyn='\e[46m'   # Ciano
bakwht='\e[47m'   # Bianco
txtrst='\e[0m'    # Text Reset


O se si preferiscono i nomi dei colori o si vogliono colori ad alta intensità:

# Reset
Color_Off='\e[0m'       # Text Reset

# Regular Colors
Black='\e[0;30m'        # Nero
Red='\e[0;31m'          # Rosso
Green='\e[0;32m'        # Verde
Yellow='\e[0;33m'       # Giallo
Blue='\e[0;34m'         # Blu
Purple='\e[0;35m'       # Viola
Cyan='\e[0;36m'         # Ciano
White='\e[0;37m'        # Bianco

# Bold
BBlack='\e[1;30m'       # Nero
BRed='\e[1;31m'         # Rosso
BGreen='\e[1;32m'       # Verde
BYellow='\e[1;33m'      # Giallo
BBlue='\e[1;34m'        # Blu
BPurple='\e[1;35m'      # Viola
BCyan='\e[1;36m'        # Ciano
BWhite='\e[1;37m'       # Bianco

# Underline
UBlack='\e[4;30m'       # Nero
URed='\e[4;31m'         # Rosso
UGreen='\e[4;32m'       # Verde
UYellow='\e[4;33m'      # Giallo
UBlue='\e[4;34m'        # Blu
UPurple='\e[4;35m'      # Viola
UCyan='\e[4;36m'        # Ciano
UWhite='\e[4;37m'       # Bianco

# Background
On_Black='\e[40m'       # Nero
On_Red='\e[41m'         # Rosso
On_Green='\e[42m'       # Verde
On_Yellow='\e[43m'      # Giallo
On_Blue='\e[44m'        # Blu
On_Purple='\e[45m'      # Purple
On_Cyan='\e[46m'        # Ciano
On_White='\e[47m'       # Bianco

# High Intensty
IBlack='\e[0;90m'       # Nero
IRed='\e[0;91m'         # Rosso
IGreen='\e[0;92m'       # Verde
IYellow='\e[0;93m'      # Giallo
IBlue='\e[0;94m'        # Blu
IPurple='\e[0;95m'      # Viola
ICyan='\e[0;96m'        # Ciano
IWhite='\e[0;97m'       # Bianco

# Bold High Intensty
BIBlack='\e[1;90m'      # Nero
BIRed='\e[1;91m'        # Rosso
BIGreen='\e[1;92m'      # Verde
BIYellow='\e[1;93m'     # Giallo
BIBlue='\e[1;94m'       # Blu
BIPurple='\e[1;95m'     # Viola
BICyan='\e[1;96m'       # Ciano
BIWhite='\e[1;97m'      # Bianco

# Underline High Intensty
UIBlack='\e[4;90m'       # Nero
UIRed='\e[4;91m'         # Rosso
UIGreen='\e[4;92m'       # Verde
UIYellow='\e[4;93m'      # Giallo
UIBlue='\e[4;94m'        # Blu
UIPurple='\e[4;95m'      # Viola
UICyan='\e[4;96m'        # Ciano
UIWhite='\e[4;97m'       # Bianco

# High Intensty backgrounds
On_IBlack='\e[0;100m'   # Nero
On_IRed='\e[0;101m'     # Rosso
On_IGreen='\e[0;102m'   # Verde
On_IYellow='\e[0;103m'  # Giallo
On_IBlue='\e[0;104m'    # Blu
On_IPurple='\e[10;95m'  # Viola
On_ICyan='\e[0;106m'    # Ciano
On_IWhite='\e[0;107m'   # Bianco

Per utilizzare i comandi dal proprio ambiente shell:

$ echo -e "${txtblu}test"
test
$ echo -e "${bldblu}test"
test
$ echo -e "${undblu}test"
test
$ echo -e "${bakblu}test"
test

Per utilizzare nei prompt (notare le virgolette e la barra \[ \] usati dalla shell per calcolare la lunghezza corretta):

PS1="\[$txtblu\]foo\[$txtred\] bar\[$txtrst\] baz : "

Prompt di escape

Di seguito i vari comandi di escape elencati nella pagina di manuale di bash:

Bash permette che queste stringhe di prompt possano essere personalizzate inserendo un
numero di backslash-escaped special characters che vengono interpretati come segue:

  \a         il carattere ASCII beep (07)
  \d         la data nel formato "Giorno-della-settimana Mese Data"
  \D{format} the format is passed to strftime(3) and the result
             is inserted into the prompt string an empty format
             results in a locale-specific time representation.
             The braces are required
  \e         un carattere di escape ASCII (033)
  \h         l'hostname fino al primo `.'
  \H         l'hostname
  \j         the number of jobs currently managed by the shell
  \l         the basename of the shell's terminal device name
  \n         il carattere "newline"
  \r         il carattere "carriage return"
  \s         il nome della shell, il nome base di $0
             (la parte che segue lo slash finale)
  \t         l'ora corrente nel formato 24-ore HH:MM:SS
  \T         l'ora corrente nel formato 12-ore HH:MM:SS
  \@         l'ora corrente nel formato 12-ore am/pm
  \A         the current time in 24-hour HH:MM format
  \u         lo username dell'utente corrente
  \v         la versione di bash (e.g., 2.00)
  \V         la release di bash, versione + patchlevel
             (es, 2.00.0)
  \w         la directory di lavoro corrente, con $HOME abbreviato con una tilde
  \W         il nome di base della directory di lavoro corrente
             abbreviato con una tilde
  \!         il numero cronologico (history number) di questo comando
  \#         il numero di questo comando
  \$         se l'UID effettivo è 0, un #, altrimenti un $
  \nnn       il carattere corrispondente al numero ottale nnn
  \\         un backslash
  \[         comincia 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
         
  Il numero di comando e il numero della cronologia sono usualmente diversi: 
  il numero della cronologia di una comando è la sua posizione nella lista della 
  cronologia, che potrebbe includere comandi reintegrati dal file di cronologia 
  (vedere HISTORY di seguito), mentre il numero di comando è la posizione nella 
  sequenza di comandi eseguiti durante la sessione di shell attuale. Dopo che la 
  stringa sia stata decodificata, e' espansa attraverso espansione di parametri, 
  sostituzione di comandi, espansione aritmetica, rimozione di apici, soggetta al 
  valore delle opzioni di promptvars della shell (vedere la descrizione del comando 
  shopt sotto SHELL BUILTIN COMMANDS, di seguito).

Posizionamento del cursore

La sequenza che segue imposta la posizione del cursore:

\[\033[<row>;<column>f\]

La posizione del cursore può essere salvata utilizzando:

\[\033[s\]

Per ripristinare una posizione, utilizzare la seguente sequenza:

\[\033[u\]

L'esempio seguente utilizza queste sequenze per visualizzare l'ora in alto a destra:

PS1=">\[\033[s\]\[\033[1;\$((COLUMNS-4))f\]\$(date +%H:%M)\[\033[u\]"

La variabile d'ambiente COLUMNS contiene il numero di colonne del terminale. L'esempio precedente sottrae 4 dal proprio valore per giustificare i cinque caratteri dell'output largo della "data" sul bordo destro.

Visualizzazione valore di ritorno

ATTENZIONE
Questo è sembrato non essere esente da bug, vedere la voce aggiunta alla pagina di discussione. È possibile aggiungere un \n dopo la faccina per evitare calcoli sbagliati sulla lunghezza della linea.

Aggiungere questa riga se si desidera vedere il valore di ritorno dell'ultimo comando eseguito. Questo dovrebbe funzionare con qualsiasi tipo di prompt fino a quando non ha bisogno di PROMPT_COMMAND:

PROMPT_COMMAND='RET=$?; if [[ $RET -eq 0 ]]; then echo -ne "\033[0;32m$RET\033[0m ;)"; else echo -ne "\033[0;31m$RET\033[0m ;("; fi; echo -n " "'

E sarà simile a questo:

0 ;) harvie@harvie-ntb ~/ $ true
0 ;) harvie@harvie-ntb ~/ $ false
1 ;( harvie@harvie-ntb ~/ $ 

Zero è verde e non-zero è di colore rosso. C'è anche l'indicazione smiley (sostituirlo con quello che si preferisce); così il prompt sorriderà se l'ultima operazione ha avuto successo.

Visualizzazione del valore di ritorno avanzata

Se si vogliono i colori, è necessario impostare i valori $RED e $GREEN:

RED='\e[0;31m'
GREEN='\e[0;32m'

È necessario specificare questi valori nei file di configurazione di Bash:

#return value visualisation
PROMPT_COMMAND='RET=$?;'
RET_VALUE='$(echo $RET)' #Ret value not colorized - you can modify it.
RET_SMILEY='$(if [[ $RET = 0 ]]; then echo -ne "\[$GREEN\];)"; else echo -ne "\[$RED\];("; fi;)'

Quindi è possibile utilizzare le variabili $RET_VALUE e $RET_SMILEY nel prompt. Si noti che è necessario usare le virgolette:

#prompt
PS1="$RET_VALUE $RET_SMILEY : "

Questo darà un prompt di base:

0 ;) : true
0 ;) : false
1 ;( : 

Ma probabilmente si desidera utilizzare $RET_VALUE or $RET_SMILEY nel proprio prompt, così:

PS1="\[$WHITE\]$RET_VALUE $RET_SMILEY \[$BLUE\]\u\[$RED\]@\[$EBLUE\]\h\[$WHITE\] \W \[$ERED\]\\$\[$EWHITE\] "

Prompt di Wolfman

Dopo aver letto la maggior parte dei Bash Prompt Howto, l'autore ha sviluppato questo prompt di Bash che mostra gli ultimi 25 caratteri della directory di lavoro attuale. I risultati migliori si ottengono su terminali con sfondo nero. Il codice seguente va inserito nel file ~/.bashrc.

  • Aggiungere la funzione bash_prompt_command. Se si possiedono alcune directory con nomi lunghi o che iniziano con molte sottodirectory, tale funzione evitera' al prompt dei compandi di riempire lo schermo, mostrando al massimo gli ultimi pwdmaxlen caratteri della PWD (directory corrente). Questo codice è tratto dalla sezione Bash Prompt Howto su Controlling the Size and Appearance of $PWD e modificato per sostituire la directory home dell'utente con una tilde.
##################################################
# Fancy PWD display function
##################################################
# The home directory (HOME) is replaced with a ~
# The last pwdmaxlen characters of the PWD are displayed
# Leading partial directory names are striped off
# /home/me/stuff          -> ~/stuff               if USER=me
# /usr/share/big_dir_name -> ../share/big_dir_name if pwdmaxlen=20
##################################################
bash_prompt_command() {
    # How many characters of the $PWD should be kept
    local pwdmaxlen=25
    # Indicate that there has been dir truncation
    local trunc_symbol=".."
    local dir=${PWD##*/}
    pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen ))
    NEW_PWD=${PWD/#$HOME/\~}
    local pwdoffset=$(( ${#NEW_PWD} - pwdmaxlen ))
    if [ ${pwdoffset} -gt "0" ]
    then
        NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen}
        NEW_PWD=${trunc_symbol}/${NEW_PWD#*/}
    fi
}
  • Questo codice genera il prompt dei comandi in cui sono definiti un paio di colori. Il colore dell'utente per il nome utente, l'hostname e il prompt ($ o #) è impostato a ciano, mentre se l'utente è root (l'UID di root è sempre 0), imposta il colore a rosso. Il prompt dei comandi è una versione colorata del prompt di default di Arch, con NEW_PWD proveniente dalla precedente funzione.
Si presti inoltre attenzione che le variabili dei colori sono racchiuse tra doppi apici (virgolette), non singoli apici (apostrofi). L'uso di singoli apici sembra creare problemi a bash per la corretta separazione di righe.
bash_prompt() {
    case $TERM in
     xterm*|rxvt*)
         local TITLEBAR='\[\033]0;\u:${NEW_PWD}\007\]'
          ;;
     *)
         local TITLEBAR=""
          ;;
    esac
    local NONE="\[\033[0m\]"    # unsets color to term's fg color
    
    # regular colors
    local K="\[\033[0;30m\]"    # black
    local R="\[\033[0;31m\]"    # red
    local G="\[\033[0;32m\]"    # green
    local Y="\[\033[0;33m\]"    # yellow
    local B="\[\033[0;34m\]"    # blue
    local M="\[\033[0;35m\]"    # magenta
    local C="\[\033[0;36m\]"    # cyan
    local W="\[\033[0;37m\]"    # white
    
    # emphasized (bolded) colors
    local EMK="\[\033[1;30m\]"
    local EMR="\[\033[1;31m\]"
    local EMG="\[\033[1;32m\]"
    local EMY="\[\033[1;33m\]"
    local EMB="\[\033[1;34m\]"
    local EMM="\[\033[1;35m\]"
    local EMC="\[\033[1;36m\]"
    local EMW="\[\033[1;37m\]"
    
    # background colors
    local BGK="\[\033[40m\]"
    local BGR="\[\033[41m\]"
    local BGG="\[\033[42m\]"
    local BGY="\[\033[43m\]"
    local BGB="\[\033[44m\]"
    local BGM="\[\033[45m\]"
    local BGC="\[\033[46m\]"
    local BGW="\[\033[47m\]"
    
    local UC=$W                 # user's color
    [ $UID -eq "0" ] && UC=$R   # root's color
    
    PS1="$TITLEBAR ${EMK}[${UC}\u${EMK}@${UC}\h ${EMB}\${NEW_PWD}${EMK}]${UC}\\$ ${NONE}"
    # without colors: PS1="[\u@\h \${NEW_PWD}]\\$ "
    # extra backslash in front of \$ to make bash colorize the prompt
}
  • Infine, aggiungere questo codice, il quale assicura che la variabile NEW_PWD sia aggiornata quando si cambia directory e imposta la variabile PS1, che contiene il prompt dei comandi.
PROMPT_COMMAND=bash_prompt_command
bash_prompt
unset bash_prompt

Prompt di KitchM

Questi prompt offrono una maggiore chiarezza visiva e testo lampeggiante. Si noti che l'uso del colore rosso nel prompt dell'utente root potrebbe dare luogo a indicazioni di attenzione.

Primo, cambiare lo sfondo di default nelle preferenze del terminale (In questo esempio si usa iul terminal di Xfce) a #D2D2D2, ed il colore del testo a #000000. I font sono impostati come DejaVu Sans Mono Book 12. Il colore del cursore è #00AA00, e il colore dell'attività dei tab è #AF0000.

Secondo, in ~/.bashrc dopo la riga PS1=, inserire una nuova riga con il seguente:

PS1='\e[1;33;47m\u \e[1;32;47mon \h \e[1;35;47m\d \@\e[0;0m\n\e[1;34m[dir.= \w] \# > \e[0;0m'

E poi mettere un # davanti alla prima riga PS1.

Terzo, per l'utente root, modificare il file /root/.bashrc nello stesso modo per includere:

PS1='\e[1;31;47m\u \e[1;32;47mon \h \e[1;35;47m\d \@\e[0;0m\n\e[1;31m[dir.= \w] \# > \e[0;0m'

Non dimenticare di commentare la riga vecchia.

Questi sono prompt a doppia linea, e dovrebbero apparire così:

Utente-

                                           
Username on myhost Sun Jan 15 12:30 PM     
[dir.= /home/username] 1 >                 
                                           

Root-

                                           
Root on myhost  Sun Jan 15 12:30 PM           
[dir.= /etc/rc.d] 1 >                      
                                           

Si noterà che i colori di sfondo renderanno più confortevole la lettura, ed i colori del testo manterranno le cose un po' più "interessanti". C'è un ampio margine di manovra per personalizzarli a piacere, in modo semplice con l'uso di colori.

Impostazione titolo finestra

Xterm e molti altri emulatori di terminale (PuTTY incluso) consentono di impostare il titolo della finestra utilizzando speciali sequenze di escape. Si possono impostare le variabili ${XTERM_TITLE} come segue, poi inserirle all'inizio del prompt per impostare il titolo di xterm (se disponibile) su directory@user@hostname:

#set xterm title
case "$TERM" in
  xterm | xterm-color)
    XTERM_TITLE='\[\e]0;\W@\u@\H\a\]'
  ;;
esac

Il testo tra 0; e \a può essere impostato come si preferisce, per esempio:

export PS1='\[\e]0;Welcome to Arch Linux\a\]\$>> '

imposta il titolo della finestra con "Benvenuto su Arch Linux" e mostra questo messaggio semplice:

$>> _

Colori diversi per l'immissione di testo e output su console

Se non si azzera il colore del testo alla fine del prompt, sia il testo inserito che il testo della console rimarranno di quel colore. Se si vuole modificare il testo in un colore speciale, ma si usa ancora il colore predefinito per l'output del comando, è necessario ripristinare il colore dopo aver premuto Invio, ma ancora prima di eseguire qualsiasi comando. È possibile farlo tramite l'installazione di una DEBUG trap nel file ~/.bashrc, in questo modo:

trap 'echo -ne "\e[0m"' DEBUG

Esempi di bashrc da Gentoo

# /etc/bash.bashrc
#
# This file is sourced by all *interactive* bash shells on startup,
# including some apparently interactive shells such as scp and rcp
# that can't tolerate any output.  So make sure this doesn't display
# anything or bad things will happen !

# Test for an interactive shell.  There is no need to set anything
# past this point for scp and rcp, and it's important to refrain from
# outputting anything in those cases.

if [[ $- != *i* ]] ; then
	# Shell is non-interactive.  Be done now!
	return
fi

# Bash won't get SIGWINCH if another process is in the foreground.
# Enable checkwinsize so that bash will check the terminal size when
# it regains control.  #65623
# http://cnswww.cns.cwru.edu/~chet/bash/FAQ (E11)
shopt -s checkwinsize

# Enable history appending instead of overwriting.  #139609
shopt -s histappend

# Change the window title of X terminals 
case ${TERM} in
	xterm*|rxvt*|Eterm|aterm|kterm|gnome*|interix)
		PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\007"'
		;;
	screen)
		PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\033\\"'
		;;
esac

use_color=false

# Set colorful PS1 only on colorful terminals.
# dircolors --print-database uses its own built-in database
# instead of using /etc/DIR_COLORS.  Try to use the external file
# first to take advantage of user additions.  Use internal bash
# globbing instead of external grep binary.
safe_term=${TERM//[^[:alnum:]]/?}   # sanitize TERM
match_lhs=""
[[ -f ~/.dir_colors   ]] && match_lhs="${match_lhs}$(<~/.dir_colors)"
[[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)"
[[ -z ${match_lhs}    ]] \
	&& type -P dircolors >/dev/null \
	&& match_lhs=$(dircolors --print-database)
[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true

if ${use_color} ; then
	# Enable colors for ls, etc.  Prefer ~/.dir_colors #64489
	if type -P dircolors >/dev/null ; then
		if [[ -f ~/.dir_colors ]] ; then
			eval $(dircolors -b ~/.dir_colors)
		elif [[ -f /etc/DIR_COLORS ]] ; then
			eval $(dircolors -b /etc/DIR_COLORS)
		fi
	fi

	if [[ ${EUID} == 0 ]] ; then
		PS1='\[\033[01;31m\]\h\[\033[01;34m\] \W \$\[\033[00m\] '
	else
		PS1='\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] '
	fi

	alias ls='ls --color=auto'
	alias grep='grep --colour=auto'
else
	if [[ ${EUID} == 0 ]] ; then
		# show root@ when we do not have colors
		PS1='\u@\h \W \$ '
	else
		PS1='\u@\h \w \$ '
	fi
fi

# Try to keep environment pollution down, EPA loves us.
unset use_color safe_term match_lhs

Colori generalizzati per tutti gli utenti

Se si vuole generalizzare l'impiego di colori per tutti gli utenti del sistema, è necessario modificare il file /etc/bash.bashrc e creare un file /etc/DIR_COLORS. Ecco una generalizzazione possibile con la combinazione di colori di Gentoo per Arch Linux:

/etc/bash.bashrc:

# /etc/bash.bashrc
#
# https://wiki.archlinux.org/index.php/Color_Bash_Prompt
#
# This file is sourced by all *interactive* bash shells on startup,
# including some apparently interactive shells such as scp and rcp
# that can't tolerate any output.  So make sure this doesn't display
# anything or bad things will happen !

# Test for an interactive shell.  There is no need to set anything
# past this point for scp and rcp, and it's important to refrain from
# outputting anything in those cases.

if [[ $- != *i* ]] ; then
	# Shell is non-interactive.  Be done now!
	return
fi

# Bash won't get SIGWINCH if another process is in the foreground.
# Enable checkwinsize so that bash will check the terminal size when
# it regains control.  #65623
# http://cnswww.cns.cwru.edu/~chet/bash/FAQ (E11)
shopt -s checkwinsize

# Enable history appending instead of overwriting.  #139609
shopt -s histappend

case ${TERM} in
  xterm*|rxvt*|Eterm|aterm|kterm|gnome*)
    PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
    ;;
  screen)
    PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033_%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
    ;;
esac

# Fortune is a simple program that displays a pseudorandom message
# from a database of quotations at logon and/or logout;
# type: "pacman -S fortune-mod" to install it, then uncomment the
# following lines:

# if [ "$PS1" ]; then
#	/usr/bin/fortune
# fi

# Set colorful PS1 only on colorful terminals.
# dircolors --print-database uses its own built-in database
# instead of using /etc/DIR_COLORS.  Try to use the external file
# first to take advantage of user additions.  Use internal bash
# globbing instead of external grep binary.

# Dynamically modified variables. Do not change them!
use_color=false
# sanitize TERM:
safe_term=${TERM//[^[:alnum:]]/?}
match_lhs=""

[[ -f ~/.dir_colors   ]] && match_lhs="${match_lhs}$(<~/.dir_colors)"
[[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)"
[[ -z ${match_lhs}    ]] \
	&& type -P dircolors >/dev/null \
	&& match_lhs=$(dircolors --print-database)
[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true

if ${use_color} ; then
	# Enable colors for ls, etc.  Prefer ~/.dir_colors #64489
	if type -P dircolors >/dev/null ; then
		if [[ -f ~/.dir_colors ]] ; then
			eval $(dircolors -b ~/.dir_colors)
		elif [[ -f /etc/DIR_COLORS ]] ; then
			eval $(dircolors -b /etc/DIR_COLORS)
		fi
	fi

	if [[ ${EUID} == 0 ]] ; then
		PS1='\[\033[01;31m\]\h\[\033[01;34m\] \W \$\[\033[00m\] '
	else
		PS1='\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] '
	fi

	alias ls='ls --color=auto'
	alias dir='dir --color=auto'
	alias grep='grep --colour=auto'
else
	if [[ ${EUID} == 0 ]] ; then
		# show root@ when we do not have colors
		PS1='\u@\h \W \$ '
	else
		PS1='\u@\h \w \$ '
	fi
fi

PS2='> '
PS3='> '
PS4='+ '

# Try to keep environment pollution down, EPA loves us.
unset use_color safe_term match_lhs

[ -r /etc/bash_completion ] && . /etc/bash_completion

/etc/DIR_COLORS:

# Configuration file for the color ls utility
# This file goes in the /etc directory, and must be world readable.
# You can copy this file to .dir_colors in your $HOME directory to override
# the system defaults.

# COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not
# pipes. 'all' adds color characters to all output. 'none' shuts colorization
# off.
COLOR all

# Extra command line options for ls go here.
# Basically these ones are:
#  -F = show '/' for dirs, '*' for executables, etc.
#  -T 0 = don't trust tab spacing when formatting ls output.
OPTIONS -F -T 0

# Below, there should be one TERM entry for each termtype that is colorizable
TERM linux
TERM console
TERM con132x25
TERM con132x30
TERM con132x43
TERM con132x60
TERM con80x25
TERM con80x28
TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM xterm
TERM vt100

# EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output)
EIGHTBIT 1

# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# Attribute codes: 
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
NORMAL 00	# global default, although everything should be something.
FILE 00 	# normal file
DIR 01;34 	# directory
LINK 01;36 	# symbolic link
FIFO 40;33	# pipe
SOCK 01;35	# socket
BLK 40;33;01	# block device driver
CHR 40;33;01 	# character device driver

# This is for files with execute permission:
EXEC 01;32 

# List any file extensions like '.gz' or '.tar' that you would like ls
# to colorize below. Put the extension, a space, and the color init string.
# (and any comments you want to add after a '#')
.cmd 01;32 # executables (bright green)
.exe 01;32
.com 01;32
.btm 01;32
.bat 01;32
.tar 01;31 # archives or compressed (bright red)
.tgz 01;31
.arj 01;31
.taz 01;31
.lzh 01;31
.zip 01;31
.z   01;31
.Z   01;31
.gz  01;31
.jpg 01;35 # image formats
.gif 01;35
.bmp 01;35
.xbm 01;35
.xpm 01;35
.tif 01;35

Ripristino del file originale /etc/bash.bashrc file

Se vi pentite di aver modificato il file /etc/bash.bashrc, è sempre possibile ripristinare il file originale di Arch /etc/bash.bashrc e rimuovere il file /etc/DIR_COLORS. Si noti che non c'è un file "ufficiale" bash.bashrc: ogni distribuzione ha il suo. Ecco la copia esatta del file /etc/bash.bashrc originale di Arch.

/etc/bash.bashrc:

#
# /etc/bash.bashrc
#

# If not running interactively, don't do anything
[[ $- != *i* ]] && return

PS1='[\u@\h \W]\$ '
PS2='> '
PS3='> '
PS4='+ '

case ${TERM} in
  xterm*|rxvt*|Eterm|aterm|kterm|gnome*)
    PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
                                                        
    ;;
  screen)
    PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033_%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
    ;;
esac

[ -r /etc/bash_completion   ] && . /etc/bash_completion

Vedere anche

Risorse esterne