Hur man anpassar kommandotolkningen

Jag är en stor fan av terminalen: om du använder en handfull kommandon (eller mer!) För att förbättra din utvecklingsprocess eller bara använda den för att snabbt flytta runt dina enheter och öppna filer och mappar, är kommandoraden ett fantastiskt verktyg. Men om du använder det ofta vill du anpassa det till dina behov. Jag ska visa dig hur man gör det idag!

Jag är ofta frågad, "Hur fick du din ledningsprompt att se ut så?" Tja, i den här handledningen visar jag dig exakt hur man gör det. Det är ganska enkelt och behöver inte för mycket av din tid.

Jag bör notera att det jag visar på dig är speciellt för bash-skalet. Det här är standardskalet på Mac och de flesta Linux-system. Om du vill ha en bash-prompten på Windows kanske du vill kolla Cygwin.


Hur fungerar det?

Innan vi börjar, låt oss prata en minut om hur du anpassar din bash prompt. Det är inte riktigt detsamma som du är vanlig applikation: det finns ingen preferenspanel. Dina anpassningar lagras i en fil. Om du är på Linux (eller använder Cygwin), blir det ditt .bashrc fil; på Mac, det är din .bash_profile fil. I båda fallen finns den här filen i din hemkatalog (om du inte är säker på var det är för en Cygwin-installation, kör kommandot echo $ HOME). Observera att jag bara hänvisar till .bashrc filen härifrån, men använd .bash_profile om du är på en Mac.

Observera att på filer (och eventuellt Linux-maskiner, jag är inte säker) är filer som börjar med en period dold som standard. För att visa dem, springa dessa två linjer i terminalen

standardvärden skriv com.apple.finder AppleShowAllFiles TRUE killall Finder

Så vad går det i det .bashrc fil? Varje rad är faktiskt ett kommando som du kan köra på kommandoraden. Faktum är att det här är hur dessa konfigurationsfiler fungerar: När du öppnar konsolen körs alla kommandon som du har skrivit i konfigurationsfilen och ställer in din miljö. Så, om du bara vill prova lite av vad jag ska visa nedan, skriv bara det på kommandoraden själv. Enkelheten här är vacker.


Anpassa PS1

Låt oss börja med en definition. De prompt är vad du ser i början av raden, varje gång du slår ange på kommandoraden. Så här är standardinställningarna för Mac:

I det här fallet är prompten andrews-macbook: ~ screencast $. Det finns några variabler här: andrew-flap är namnet på den här datorn, ~ är den aktuella katalogen (hemkatalogen) och screencast är användarnamnet. Låt oss anpassa det här lite.

Öppna antingen din .bashrc fil. Hur vi ställer in vilken information som visas i prompten är med PS1 variabel. Lägg till detta i filen:

PS1 = '->'

Observera att jag inte placerar mellanslag på vardera sidan av jämliksignalen; det är nödvändigt. Spara den här filen i din hemkatalog och öppna ett terminalfönster igen. Nu borde du få en fråga som ser ut så här:

Jag noterar här att om du tycker det är tråkigt att stänga och öppna din terminal varje gång du byter till din .bashrc eller .bash_profile, Det är lite av en genväg: Du kan ladda vilken bash-anpassningsfil som helst med källa kommando. Kör detta i din terminal:

källa ~ / .bashrc

Fortfarande för länge? Tja, en enda period (.) är ett alias för källa. Glad nu? Om du är snabb, inser du att vi kan använda källa kommandot att inkludera andra filer i vårt .bashrc fil, om du vill dela upp det för att hålla dig under kontroll.

Låt oss anpassa vår prompten lite mer. Vi kan använda inbyggda variabler i strängen vi tilldelar PS1 att inkludera användbar information i prompten här är några användbara:

  • \ d: Datum
  • \ h: Värd
  • \ n: Ny linje
  • \ t: Tid
  • \ u: Användarnamn
  • \ W: Aktuell arbetskatalog
  • \ w: Fullständig sökväg till aktuell katalog

Så om du ställer din fråga till det här:

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

du borde se något så här:

Lägg märke till några saker här: För det första använder vi en massa variabler som visas ovan för att ge oss mer information. Men för det andra innehåller vi några nya linjer där och får en mer intressant prompten: vi har den aktuella katalogen på en rad och sedan den faktiska prompten på nästa rad. Jag föredrar min prompten på det här sättet, eftersom jag alltid har lika mycket utrymme att skriva mina kommandon, oavsett hur länge sökvägen till den aktuella katalogen är. Det finns dock ett bättre sätt att göra detta, så låt oss titta på det nu.


Anpassa PROMPT_COMMAND

Det bättre sättet att göra detta är användningen av PROMPT_COMMAND variabel; innehållet i denna variabel är inte bara en sträng, som med PS1. Det är faktiskt ett kommando som körs innan bash visar prompten. För att försöka, låt oss lägga till det här i vårt .bashrc:

PROMPT_COMMAND = "echo" kommer före prompten ""

Vi använder eko kommandot här; om du inte är bekant med det, skickar du bara en sträng, och den kommer skriva till terminalen. I sig är det inte otroligt användbart (även om du kan använda den för att visa variabler: echo $ PS1), men det är bra när det används med andra kommandon, så visa deras produktion. Om du lägger till raden ovan bör du se detta:

Låt oss göra något mer användbart här. Låt oss skriva en bash-funktion som vi kommer att tilldela PROMPT_COMMAND. Prova detta:

print_before_the_prompt () echo "kommer före prompten" PROMPT_COMMAND = print_before_the_prompt

Om du använder det här borde du inte se skillnad i din fråga från vad vi har ovan. Nu, låt oss göra detta användbart.

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

Så här får du:

Det är en bra start, men jag vill göra lite mer. Jag ska använda printf kommando istället för eko eftersom det gör det enklare med nya linjer och variabler. En snabb bakgrund på printf kommando: det tar flera parameters, den första är en slags mall för strängen som kommer att matas ut. De andra parametrarna är värden som kommer att ersättas i mallsträngen där det är lämpligt. vi får se hur det här fungerar.

Så låt oss göra det här:

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

Se dem % s delar där inne? Det betyder att tolka värdet för denna plats som en sträng ?; för kontext kan vi också använda % d att formatera värdet som ett decimaltal. Som ni kan se har vi två % ss i "mallen" sträng och två andra parametrar. Dessa kommer att placeras i strängen där % ss är. Observera också newlines i början och slutet: den första ger bara terminalen något andningsrum. Den sista kontrollerar att prompten (PS1) kommer att skrivas ut på nästa rad, och inte på samma rad som PROMPT_COMMAND.

Du borde få en terminal så här:


Lägger till lite färg

Ser bra ut! Men låt oss ta det ett steg längre. Låt oss lägga till lite färg på detta. Vi kan använda vissa specialkoder för att ändra färgen på texten i terminalen. Det kan vara ganska skrämmande att använda den faktiska koden, så jag gillar att kopiera den här listan över variabler för färgen och lägga till den högst upp på min .bashrc fil:

txtblk = '\ e [0; 30m' # Black - Regular txtred = "\ e [0; 31m" # Red txtgrn = "\ e [0; 32m" # Grön txtylw = "\ e [0; 33m" # Gul txtblu = "\ e [0; 36m" # Blue txtpur = "\ e [0; 35m" # Purple txtcyn = "\ e [0; 36m" # Cyan txtwht = "\ e [0; 37m" # White bldblk = "# 1; 30m" # Black - Bold bldred = "\ e [1; 31m" # Red bldgrn = "\ e [1; 32m" # Green bldylw = "\ e [1; 33m" # Gul bldblu = [1; 34m "# Blue bldpur =" \ e [1; 35m "# Purple bldcyn =" \ e [1; 36m "# Cyan bldwht =" \ e [1; 37m "# White unkblk =" \ e [4; 32m "# Grön undylw =" \ e [4; 31m "# Röd undgrn =" \ e [4; 32m "# Grön undylw =" \ e [4; 33m "# Gul undblu =" \ e [4; 34m "# Blå undpur =" \ e [4; 35m "# Purple undcyn =" \ e [4; 36m "# Cyan undwht =" \ e [4; 37m "# White bakblk =" \ e [ 40m "# Black - Bakgrund bakred =" \ e [41m "# Red badgrn =" \ e [42m "# Grön bakylw =" \ e [43m "# Gul bakblu =" \ e [44m "# Blå bakpur =" \ e [45m "# Purple bakcyn =" \ e [46m "# Cyan bakwht =" \ e [47m "# White txtrst =" \ e [0m "# Text Reset

Det finns någon metod för den här galningen: Den första uppsättningen slår på normal färgning. Den andra uppsättningen aktiverar fet färgning. Den tredje uppsättningen aktiverar understruken färgning. Och den fjärde uppsättningen aktiverar bakgrundsfärgning. Den sista återställer färgen till normalt. Så, låt oss använda dessa!

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

Här har jag lagt till $ txtred före den första % s, och $ bldgrn före den andra % s; då, i slutet, har jag återställt textfärgen. Du måste göra detta för att när du har satt en färg kommer den att hålla tills du antingen använder en ny färg eller återställer färgningen. Du märker också att när du ställer in en variabel prefixar du inte den med ett dollar tecken; men vi använder dollarns tecken när vi använder variabeln: det är hur bash-variabler fungerar. Detta ger oss följande:

Låt oss gå vidare till det sista steget: lägga till några skript för att ge oss ännu mer information.


Lägga till Version Control Information

Om du har sett screencasts som följer med min bok, kommer du bra med Git, kanske du kommer ihåg att jag har någon versionskontrollinformation som visas i min prompten. Jag fick den här ideen från den utmärkta PeepCode? Advanced Command Line? screencast, som delar detta, liksom många andra bra tips.

För att göra detta måste vi ladda ner och bygga skriptet som hittar den här informationen. Gå vidare till förvaret för vcprompt, ett skript som matar ut versionskontrollinformationen. Om du är bekant med styrsystemet Mercurial version kan du använda det för att få repo, men du kommer sannolikt att träffa den "zip" länken för att ladda ner skriptkoden som en zip-fil. När du släpper upp det måste du bygga manuset. För att göra detta, bara CD in i mappen Unzipped script och kör kommandot göra. När det här kommandot körs bör du se en fil med namnet "vcprompt" i mappen. Det här är det körbara skriptet.

Så, hur använder vi det här i vår prompten? Tja, detta leder till en viktig kaninspår: hur installerar vi? ett manus (som den här) så att vi kan använda den i terminalen? Alla kommandon som du kan köra på terminalen finns i en definierad uppsättning mappar; Denna array är PATH-variabeln. Du kan se en lista över mapparna som finns i din PATH genom att köra echo $ PATH. Det kan se ut så här:

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

Vad vi behöver göra är att placera det körbara skriptet vcprompt i en mapp som ligger i vår väg. Vad jag gillar att göra (och ja, jag lärde mig det här tricket från den PeepCode screencast), skapar en mapp med namnet "bin" (kort för "binärt") i min hemkatalog och lägger till den mappen i min PATH. Lägg till detta i din .bashrc:

exportera PATH = ~ / bin: $ PATH

Detta ställer in PATH till ~ / Bin, plus vad som än var redan i PATH-variabeln. Om vi ​​nu sätter det vcprompt skript i ~ / bin, kommer vi att kunna utföra det i vilken mapp som helst på terminalen.

Så, låt oss nu lägga till det här till vår prompten:

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

jag har lagt till $ txtpur% s till "mallen" sträng och lägger till den fjärde parametern"$ (Vcprompt)". Använda dollartecken och parentes kommer att exekvera manuset och returnera utmatningen. Nu får du det här:

Observera att om mappen inte använder någon typ av versionskontroll, visas ingenting. Men om vi är i ett förråd, får vi det versionsstyrningssystem som används (Git, i mitt fall) och filnamnet. Du kan anpassa den här utmatningen lite om du vill: Kontrollera Readme-filen som du hämtade med källkoden för vcprompt manus.


Gå vidare!

Här är vår fullständiga .bashrc eller .bash_profile fil:

exportera PATH = ~ / bin: $ PATH txtblk = "\ e [0; 30m" # Svart - Vanlig txtred = "\ e [0; 31m" # Red txtgrn = "\ e [0; 32m" # Green txtylw = " [0; 33m "# Gul txtblu =" \ e [0; 34m "# Blå txtpur =" \ e [0; 35m "# Lila txtcyn =" \ e [0; 36m "# Cyan txtwht =" \ e [0; 37m "# White bldblk =" \ e [1; 30m "# Black - Bold bldred =" \ e [1; 31m "# Red bldgrn =" \ e [1; 32m "# Green bldylw =" \ e [1; 33m "# Gul bldblu =" \ e [1; 34m "# Blå bldpur =" \ e [1; 35m "# Lilla bldcyn =" \ e [1; 36m "# Cyan bldwht =" \ e [1 ; 37m "# White unkblk =" \ e [4; 30m "# Black - Underline undred =" \ e [4; 31m "# Red undgrn =" \ e [4; 32m "# Grön undylw =" \ e [4 33m "# Gul undblu =" \ e [4; 34m "# Blå undpur =" \ e [4; 35m "# Purple undcyn =" \ e [4; 36m "# Cyan undwht =" \ e [4; "# White bakblk =" \ e [40m "# Svart - Bakgrund bakred =" \ e [41m "# Red badgrn =" \ e [42m "# Grön bakylw =" \ e [43m "# Gul 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 =" -> "

Tja, det är en krasch-kurs på att anpassa din bash prompt. Om du har några frågor, var noga med att släppa dem i kommentarerna!