Come personalizzare il prompt dei comandi

Sono un grande fan del terminale: che tu stia sfruttando una manciata di comandi (o più!) Per migliorare il tuo processo di sviluppo, o semplicemente utilizzarlo per spostarti rapidamente tra le tue unità e aprire file e cartelle, la riga di comando è uno strumento fantastico. Tuttavia, se lo si utilizza spesso, è necessario personalizzarlo in base alle proprie esigenze. Ti mostrerò come farlo oggi!

Spesso mi viene chiesto, "Come hai ottenuto il prompt dei comandi per apparire così?" Bene, in questo tutorial ti mostrerò esattamente come farlo. È piuttosto semplice e non richiederà troppo tempo.

Dovrei notare che ciò che sto dimostrando è specificamente per la shell bash; questa è la shell predefinita su Mac e sulla maggior parte dei sistemi Linux. Se desideri un prompt di bash su Windows, potresti voler controllare Cygwin.


Come funziona?

Prima di iniziare, parliamo per un minuto di come personalizzare il prompt di bash. Non è proprio la tua applicazione media: non c'è un pannello delle preferenze. Le tue personalizzazioni sono memorizzate in un file. Se sei su Linux (o usando Cygwin), quello sarà il tuo .bashrc file; su Mac, questo è il tuo .bash_profile file. In entrambi i casi, questo file è conservato nella tua home directory (se non sei sicuro di dove sia l'installazione di Cygwin, esegui il comando echo $ HOME). Nota che mi riferirò solo a .bashrc file da qui in poi, ma usa il .bash_profile se sei su un Mac.

Nota che su Mac (e forse su macchine Linux, non ne sono sicuro), i file che iniziano con un punto sono nascosti di default. Per visualizzarli, esegui queste due linee nel terminale

defaults write com.apple.finder AppleShowAllFiles TRUE killall Finder

Quindi, quello che succede in questo .bashrc file? Ogni riga è in realtà un comando che è possibile eseguire sulla riga di comando. In effetti, è così che funzionano questi file di configurazione: quando apri la console, tutti i comandi che hai scritto nel file di configurazione vengono eseguiti, impostando il tuo ambiente. Quindi, se vuoi solo provare un po 'di ciò che mostrerò qui sotto, basta scriverlo sulla riga di comando stessa. La semplicità qui è bellissima.


Personalizzazione PS1

Iniziamo con una definizione. Il richiesta è ciò che vedi all'inizio della riga, ogni volta che premi premi Invio sulla riga di comando. Ecco quali sono le impostazioni predefinite per il Mac:

In questo caso, il prompt è andrews-macbook: ~ screencast $. Ci sono alcune variabili qui: andrew-macbook è il nome di questo computer, ~ è la directory corrente (la home directory) e screencast è il nome utente. Personalizziamola un po '.

Apri il tuo .bashrc file. Il modo in cui impostiamo quali informazioni sono visualizzate nel prompt è con PS1 variabile. Aggiungi questo al file:

PS1 = '->'

Si noti che non inserisco spazi su entrambi i lati del segno di uguale; è necessario Salva questo file nella tua home directory e riapri una finestra di terminale. Ora dovresti avere un prompt che assomiglia a questo:

Noterò qui che se trovi noioso chiudere e riaprire il tuo terminale ogni volta che apporti una modifica al tuo .bashrc o .bash_profile, c'è un po 'di una scorciatoia: puoi caricare qualsiasi file di personalizzazione bash con fonte comando. Esegui questo nel tuo terminale:

fonte ~ / .bashrc

Ancora troppo lungo? Bene, un singolo periodo (.) è un alias per fonte. Felice adesso? Se sei veloce, ti renderai conto che possiamo usare il fonte comando per includere altri file all'interno del nostro .bashrc file, se vuoi dividerlo per tenerlo sotto controllo.

Personalizziamo il nostro prompt un po 'di più. Possiamo usare le variabili incorporate nella stringa a cui assegniamo PS1 includere informazioni utili nel prompt; ecco alcuni utili:

  • \ d: Data
  • \ h: Ospite
  • \ n: Nuova linea
  • \ t: Tempo
  • \ u: Nome utente
  • \ W: Directory di lavoro corrente
  • \ w: Percorso completo alla directory corrente

Quindi, se si imposta la richiesta a questo:

PS1 = '\ n \ W \ n [\ h] [\ u] ->'

dovresti vedere qualcosa di simile a questo:

Notate alcune cose qui: in primo luogo, stiamo usando un gruppo di variabili mostrate sopra per darci maggiori informazioni. In secondo luogo, stiamo includendo alcuni newline e ricevendo un suggerimento più interessante: abbiamo la directory corrente su una riga, e quindi la richiesta effettiva sulla riga successiva. Preferisco il mio prompt in questo modo, perché ho sempre la stessa quantità di spazio per scrivere i miei comandi, indipendentemente dalla lunghezza del percorso della directory corrente. Tuttavia, c'è un modo migliore per farlo, quindi diamo un'occhiata a questo ora.


Personalizzazione PROMPT_COMMAND

Il modo migliore per farlo è usare il PROMPT_COMMAND variabile; il contenuto di questa variabile non è solo una stringa, come con PS1. In realtà è un comando che viene eseguito prima che bash mostri il prompt. Per provare, aggiungiamolo al nostro .bashrc:

PROMPT_COMMAND = 'echo' viene prima del prompt ""

Stiamo usando il eco comando qui; se non ti è familiare, basta passargli una stringa e la scriverà sul terminale. Di per sé, non è incredibilmente utile (anche se puoi usarlo per visualizzare le variabili: echo $ PS1), ma è ottimo se usato con altri comandi, quindi visualizza il loro output. Se hai aggiunto la riga sopra, dovresti vedere questo:

Facciamo qualcosa di più utile qui. Scriviamo una funzione di bash a cui assegneremo PROMPT_COMMAND. Prova questo:

print_before_the_prompt () echo "viene prima del prompt" PROMPT_COMMAND = print_before_the_prompt

Se lo usi, non dovresti vedere una differenza nel tuo prompt da ciò che abbiamo sopra. Ora, rendiamolo utile.

print_before_the_prompt () echo "$ USER: $ PWD" PROMPT_COMMAND = print_before_the_prompt PS1 = "->"

Ecco cosa otterrai:

È un buon inizio, ma voglio fare ancora un po '. Userò il printf comando invece di eco perché rende più semplici le newline e le variabili. Uno sfondo veloce sul printf comando: richiede diversi parametri, il primo è una sorta di modello per la stringa che verrà emessa. Gli altri parametri sono valori che saranno sostituiti nella stringa del modello dove appropriato; vedremo come funziona.

Quindi facciamo questo:

print_before_the_prompt () printf "\ n% s:% s \ n" "$ USER" "$ PWD"

Vedi quelli %S parti in là? Ciò significa? Interpretare il valore di questo punto come una stringa ?; per il contesto, potremmo anche usarlo % d per formattare il valore come numero decimale. Come puoi vedere, ne abbiamo due %Ss nel modello? stringa e altri due parametri. Questi saranno collocati nella stringa in cui il %Ss sono. Inoltre, nota le newline all'inizio e alla fine: la prima dà al terminale un po 'di respiro. L'ultimo si assicura che il prompt (PS1) verrà stampato sulla riga successiva e non sulla stessa riga di PROMPT_COMMAND.

Dovresti prendere un terminale come questo:


Aggiunta di un po 'di colore

Guardando bene! Ma facciamo un altro passo avanti. Aggiungiamo un po 'di colore a questo. Possiamo usare alcuni codici speciali per cambiare il colore del testo nel terminale. Può essere piuttosto scoraggiante usare il codice reale, quindi mi piace copiare questo elenco di variabili per il colore e aggiungerlo nella parte superiore del mio .bashrc file:

txtblk = '\ e [0; 30m' # Nero - Regolare 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 - Grassetto bldred = "\ e [1; 31m" # Rosso bldgrn = "\ e [1; 32m" # Verde bldylw = "\ e [1; 33m" # Giallo bldblu = "\ e [1; 34m" # Blue bldpur = "\ e [1; 35m" # Purple bldcyn = "\ e [1; 36m" # Cyan bldwht = "\ e [1; 37m" # White unkblk = "\ e [4; 30m "# Nero - Sottolineato undred =" \ e [4; 31m "# Rosso undgrn =" \ e [4; 32m "# Verde undylw =" \ e [4; 33m "# Giallo undblu =" \ e [4; 34m "# Blue undpur =" \ e [4; 35m "# Purple undcyn =" \ e [4; 36m "# Cyan undwht =" \ e [4; 37m "# White bakblk =" \ e [ 40m "# Nero - Sfondo bakred =" \ e [41m "# Red badgrn =" \ e [42m "# Green bakylw =" \ e [43m "# Giallo bakblu =" \ e [44m "# Blue bakpur =" \ e [45m "# Purple bakcyn =" \ e [46m "# Cyan bakwht =" \ e [47m "# White txtrst =" \ e [0m "# Reset testo

C'è un metodo per questa pazzia: il primo set si accende con una colorazione normale. Il secondo set attiva la colorazione audace. Il terzo set attiva la colorazione sottolineata. E quel quarto set accende la colorazione dello sfondo. Quest'ultimo azzera la colorazione alla normalità. Quindi, usiamo questi!

print_before_the_prompt () printf "\ n $ txtred% s: $ bldgrn% s \ n $ txtrst" "$ USER" "$ PWD"

Ecco, ho aggiunto $ txtred prima del primo %S, e $ bldgrn prima del secondo %S; poi, alla fine, ho ripristinato il colore del testo. Devi farlo perché, una volta impostato un colore, si manterrà fino a quando non utilizzerai un nuovo colore o ripristinerai la colorazione. Noterai anche che quando si imposta una variabile, non viene anteposta a un segno di dollaro; ma usiamo il simbolo del dollaro quando si utilizza la variabile: questo è il modo in cui le variabili di bash funzionano. Questo ci dà il seguente:

Passiamo al passaggio finale: aggiungendo alcuni script per darci ancora più informazioni.


Aggiunta di informazioni sul controllo della versione

Se hai visto gli screencast che accompagnano il mio libro Getting Good with Git, potresti ricordare di avere alcune informazioni sul controllo della versione mostrate nel mio prompt. Ho avuto questa idea dall'eccellente PeepCode? Advanced Command Line? screencast, che condividono questo, così come molti altri ottimi consigli.

Per fare questo, avremo bisogno di scaricare e compilare lo script che trova queste informazioni. Andare al repository per vcprompt, uno script che restituisce le informazioni sul controllo della versione. Se hai familiarità con il sistema di controllo della versione Mercurial, puoi usarlo per ottenere il repository, ma molto probabilmente vorrai premere il link "zip" per scaricare il codice dello script come file zip. Una volta decompresso, dovrai creare lo script. Per fare questo, solo CD nella cartella degli script decompressa ed eseguire il comando rendere. Una volta eseguito questo comando, dovresti vedere un file chiamato "vcprompt" nella cartella. Questo è lo script eseguibile.

Quindi, come usiamo questo nel nostro prompt? Bene, questo mostra un'importante pista dei conigli: come installiamo? uno script (come questo) in modo che possiamo usarlo nel terminale? Tutti i comandi che è possibile eseguire sul terminale si trovano in una serie definita di cartelle; questa matrice è la variabile PATH. È possibile visualizzare un elenco delle cartelle attualmente nel PATH eseguendo echo $ PATH. Potrebbe sembrare qualcosa del genere:

/ Usr / bin: / bin: / usr / sbin: / sbin: / usr / local / bin: / usr / X11 / bin

Quello che dobbiamo fare è mettere lo script eseguibile vcprompt in una cartella che è nel nostro percorso. Quello che mi piace fare (e sì, ho imparato questo trucco da questo screencast PeepCode, anche) è creare una cartella chiamata 'bin' (abbreviazione di 'binary') nella mia home directory e aggiungere quella cartella al mio PATH. Aggiungi questo al tuo .bashrc:

export PATH = ~ / bin: $ PATH

Questo imposta PATH a ~ / Bin, più ciò che era già nella variabile PATH. Se ora lo mettiamo vcprompt script in ~ / bin, saremo in grado di eseguirlo in qualsiasi cartella sul terminale.

Quindi, ora aggiungiamo questo al nostro prompt:

print_before_the_prompt () printf "\ n $ txtred% s: $ bldgrn% s $ txtpur% s \ n $ txtrst" "$ USER" "$ PWD" "$ (vcprompt)"

ho aggiunto $ txtpur% s al? modello? stringa e ha aggiunto il quarto parametro"$ (Vcprompt)". Usando il simbolo del dollaro e le parentesi si eseguirà lo script e si restituirà l'output. Ora, otterrai questo:

Si noti che se la cartella non utilizza alcun tipo di controllo di versione, non viene mostrato nulla. Ma, se siamo in un repository, otteniamo il sistema di controllo della versione che viene utilizzato (Git, nel mio caso) e il nome del ramo. È possibile personalizzare un po 'questa uscita, se lo si desidera: controllare il file Leggimi scaricato con il codice sorgente per vcprompt copione.


Andare avanti!

Ecco il nostro completo .bashrc o .bash_profile file:

export PATH = ~ / bin: $ PATH txtblk = "\ e [0; 30m" # Nero - Regolare 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 - Grassetto bldred =" \ e [1; 31m "# Rosso bldgrn =" \ e [1; 32m "# Verde bldylw =" \ e [1; 33m "# Yellow bldblu =" \ e [1; 34m "# Blue bldpur =" \ e [1; 35m "# Purple bldcyn =" \ e [1; 36m "# Cyan bldwht =" \ e [1 ; 37m "# White unkblk =" \ e [4; 30m "# Black - Sottolineato undred =" \ e [4; 31m "# Red undgrn =" \ e [4; 32m "# Verde undylw =" \ e [4 ; 33m "# Yellow undblu =" \ e [4; 34m "# Blue undpur =" \ e [4; 35m "# Purple undcyn =" \ e [4; 36m "# Cyan undwht =" \ e [4; 37m "# Bianco bakblk =" \ e [40m "# Nero - Sfondo bakred =" \ e [41m "# Red badgrn =" \ e [42m "# Green bakylw =" \ e [43m "# Giallo bakblu =" \ e [44m "# Blue bakpur =" \ e [45m "# Purple bakcyn =" \ e [46m "# Cyan bakwht =" \ e [47m "# White txtrst =" \ e [0m "# Text Reset print_before_the_prompt ()  printf "\ n $ txtred% s: $ bldgrn% s $ txtpur% s \ n $ txtrst" "$ USER" "$ PWD" "$ (vcprompt) " PROMPT_COMMAND = print_before_the_prompt PS1 =" -> "

Bene, questo è un corso accelerato sulla personalizzazione del prompt di bash. Se hai domande, assicurati di lasciarle nei commenti!