Hoe de opdrachtprompt aan te passen

Ik ben een grote fan van de terminal: of je nu een handvol commando's (of meer!) Gebruikt om je ontwikkelingsproces te verbeteren, of gewoon om het te gebruiken om snel rond je schijven te bewegen en bestanden en mappen te openen, de commandoregel is een geweldige tool. Als u het echter vaak gebruikt, moet u het aanpassen aan uw behoeften. Ik zal je laten zien hoe je dat vandaag doet!

Ik word vaak gevraagd: "Hoe kreeg je je opdrachtprompt om er zo uit te zien?" In deze zelfstudie laat ik je precies zien hoe je dit moet doen. Het is vrij eenvoudig en je hebt niet al te veel tijd nodig.

Ik moet opmerken dat wat ik je laat zien specifiek is voor de bash-shell; dit is de standaard shell op Mac en de meeste Linux-systemen. Als u een bash-prompt op Windows wilt, wilt u misschien Cygwin bekijken.


Hoe werkt het?

Voordat we beginnen, laten we het even hebben over hoe u uw bash-prompt aanpast. Het is niet helemaal hetzelfde als je gemiddelde applicatie: er is geen voorkeurenpaneel. Uw aanpassingen worden opgeslagen in een bestand. Als je Linux gebruikt (of Cygwin gebruikt), is dat jouw .bashrc het dossier; op Mac, dat is jouw .bash_profile het dossier. In beide gevallen wordt dit bestand in uw thuismap bewaard (als u niet zeker weet waar dat is voor een Cygwin-installatie, voert u de opdracht uit echo $ HOME). Merk op dat ik alleen naar de .bashrc bestand vanaf hier uit, maar gebruik de .bash_profile als je op een Mac werkt.

Merk op dat op Macs (en mogelijk Linux-machines, ik weet het niet zeker), bestanden die beginnen met een punt standaard verborgen zijn. Om ze te tonen, voert u deze twee lijnen in de terminal uit

standaardinstellingen schrijf com.apple.finder AppleShowAllFiles TRUE killall Finder

Dus wat gaat dat in .bashrc het dossier? Elke regel is eigenlijk een opdracht die u op de opdrachtregel kunt uitvoeren. In feite is dat hoe deze configuratiebestanden werken: Wanneer u de console opent, worden alle opdrachten die u in het configuratiebestand hebt geschreven uitgevoerd, waarbij uw omgeving wordt ingesteld. Dus, als je gewoon wat wilt uitproberen wat ik hieronder zal laten zien, typ je het gewoon op de opdrachtregel zelf. De eenvoud hier is prachtig.


aanpassen PS1

Laten we beginnen met een definitie. De prompt is wat u aan het begin van de regel ziet, telkens wanneer u op de opdrachtregel op enter drukt. Dit zijn de standaardinstellingen voor de Mac:

In dit geval is de prompt andrews-macbook: ~ screencast $. Er zijn een paar variabelen hier: andrew-macbook is de naam van deze computer, ~ is de huidige map (de hoofddirectory) en screencast is de gebruikersnaam. Laten we dit een beetje aanpassen.

Open uw .bashrc het dossier. De manier waarop we instellen welke informatie in de prompt wordt weergegeven, is met de PS1 variabel. Voeg dit toe aan het bestand:

PS1 = '->'

Merk op dat ik geen spaties aan beide zijden van het gelijkteken plaats; dat is nodig. Bewaar dit bestand in je thuismap en open een terminalvenster opnieuw. Nu zou u een prompt moeten hebben die er als volgt uitziet:

Ik zal hier opmerken dat als u het vervelend vindt om uw terminal te sluiten en opnieuw te openen telkens wanneer u een wijziging aanbrengt in uw .bashrc of .bash_profile, er is een beetje een snelkoppeling: je kunt elk bash-aanpassingsbestand laden met de bron commando. Voer dit uit in uw terminal:

source ~ / .bashrc

Nog steeds te lang? Nou, een enkele periode (.) is een alias voor bron. Nu blij? Als je snel bent, zul je je realiseren dat we de bron commando om andere bestanden op te nemen in onze .bashrc bestand, als u het wilt opsplitsen om het onder controle te houden.

Laten we onze prompt een beetje meer aanpassen. We kunnen ingebouwde variabelen gebruiken in de reeks die we toewijzen PS1 om nuttige informatie in de prompt op te nemen; hier zijn een paar handige:

  • \ d: Datum
  • \ h: Host
  • \ n: Nieuwe lijn
  • \ t: Tijd
  • \ u: Gebruikersnaam
  • \ w: Huidige werkdirectory
  • \ w: Volledig pad naar huidige map

Dus, als u uw prompt hier op instelt:

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

je zou zoiets moeten zien:

Let hier een paar dingen op: ten eerste gebruiken we een aantal van de hierboven getoonde variabelen om ons meer informatie te geven. Maar ten tweede voegen we een paar nieuwe regels toe en krijgen we een interessantere prompt: we hebben de huidige directory op één regel en dan de daadwerkelijke prompt op de volgende regel. Ik geef de voorkeur aan mijn prompt op deze manier, omdat ik altijd dezelfde hoeveelheid ruimte heb om mijn opdrachten te schrijven, ongeacht hoe lang het pad naar de huidige map is. Er is echter een betere manier om dit te doen, dus laten we daar nu naar kijken.


aanpassen PROMPT_COMMAND

De betere manier om dit te doen is het gebruik van de PROMPT_COMMAND variable; de inhoud van deze variabele is niet alleen een tekenreeks, zoals met PS1. Het is eigenlijk een opdracht die wordt uitgevoerd voordat bash de prompt weergeeft. Om dit een kans te geven, laten we dit aan ons toevoegen .bashrc:

PROMPT_COMMAND = 'echo' komt voor de prompt ''

We gebruiken de echo commando hier; als je er niet bekend mee bent, geef je het gewoon een string door en zal het naar de terminal worden geschreven. Op zich is het niet ongelooflijk nuttig (hoewel je het kunt gebruiken om variabelen te bekijken: echo $ PS1), maar het is geweldig in combinatie met andere opdrachten, dus geef hun uitvoer weer. Als je de bovenstaande regel hebt toegevoegd, zou je dit moeten zien:

Laten we hier iets nuttigs doen. Laten we een bash-functie schrijven waaraan we zullen toewijzen PROMPT_COMMAND. Probeer dit:

print_before_the_prompt () echo "komt voor de prompt" PROMPT_COMMAND = print_before_the_prompt

Als u dit gebruikt, zou u geen verschil in uw prompt moeten zien van wat we hierboven hebben. Laten we dit nuttig maken.

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

Dit is wat je krijgt:

Dat is een goed begin, maar ik wil een beetje meer doen. Ik ga de gebruiken printf opdracht in plaats van echo omdat het maakt inclusief het opnemen van nieuwe regels en variabelen een beetje gemakkelijker. Een snelle achtergrondinformatie over de printf opdracht: er zijn verschillende parameters voor nodig, de eerste is een soort sjabloon voor de tekenreeks die wordt uitgevoerd. De andere parameters zijn waarden die waar nodig in de sjabloonstring worden vervangen; we zullen zien hoe dit werkt.

Dus laten we dit doen:

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

Zie die % s onderdelen erin? Dat betekent? Interpreteer de waarde voor deze plek als een tekenreeks ?; voor context kunnen we ook gebruiken % d om de waarde op te maken als een decimaal getal. Zoals je kunt zien, hebben we er twee % ss in de? -sjabloon? string en twee andere parameters. Deze worden in de string geplaatst waar de % ss zijn. Let ook op de nieuwe regels aan het begin en het einde: de eerste geeft de terminal een beetje ademruimte. De laatste zorgt ervoor dat de prompt (PS1) wordt afgedrukt op de volgende regel en niet op dezelfde regel als PROMPT_COMMAND.

Je zou een terminal als deze moeten krijgen:


Een beetje kleur toevoegen

Ziet er goed uit! Maar laten we nog een stap verder gaan. Laten we hier wat kleur aan toevoegen. We kunnen een aantal speciale codes gebruiken om de kleur van de tekst in de terminal te wijzigen. Het kan nogal ontmoedigend zijn om de eigenlijke code te gebruiken, dus ik kopieer deze lijst met variabelen voor de kleur graag en voeg deze toe aan de bovenkant van mijn .bashrc het dossier:

txtblk = '\ e [0; 30m' # Zwart - Normaal txtred = "\ e [0; 31m" # Rood txtgrn = "\ e [0; 32m" # Groen txtylw = "\ e [0; 33m" # Geel txtblu = "\ e [0; 34m" # Blauw txtpur = "\ e [0; 35m" # Paars txtcyn = "\ e [0; 36m" # Cyaan 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" # # 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 "# Zwart - Onderstrepen undred =" \ e [4; 31m "# Rood undgrn =" \ e [4; 32m "# Groen undylw =" \ e [4; 33m "# Geel undblu =" \ e [4; 34m "# Blue undpur =" \ e [4; 35m "# Purple undcyn =" \ e [4; 36m "# Cyan undwht =" \ e [4; 37m "# White bakblk =" \ e [ 40m "# Zwart - Achtergrond bakred =" \ e [41m "# Rode badgrn =" \ e [42m "# Groene bakylw =" \ e [43m "# Gele bakblu =" \ e [44m "# Blauwe bakpur =" \ e [45m "# Purple bakcyn =" \ e [46m "# Cyaan bakwht =" \ e [47m "# Wit txtrst =" \ e [0m "# Tekst resetten

Er is een methode voor deze waanzin: de eerste set is de normale kleur aanzetten. De tweede set maakt gedurfde kleuren. Bij de derde set worden onderstreepte kleuren geactiveerd. En die vierde set schakelt achtergrondkleuren in. Die laatste reset de kleuring naar normaal. Dus laten we deze gebruiken!

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

Hier heb ik eraan toegevoegd $ txtred voor de eerste % s, en $ bldgrn voor de tweede % s; aan het einde heb ik de tekstkleur opnieuw ingesteld. Dit moet je doen, want zodra je een kleur hebt ingesteld, blijft deze behouden totdat je een nieuwe kleur gebruikt of de kleur opnieuw instelt. U zult ook opmerken dat bij het instellen van een variabele, we niet het voorvoegsel met een dollarteken; maar we gebruiken het dollarteken bij het gebruik van de variabele: dat is de manier waarop bash-variabelen werken. Dit geeft ons het volgende:

Laten we verdergaan naar de laatste stap: wat scripting toevoegen om ons nog meer informatie te geven.


Versiebeheerinformatie toevoegen

Als je de screencasts hebt gezien die bij mijn boek Getting Good with Git horen, weet je misschien nog wel dat ik informatie over de versiebeheer in mijn prompt heb staan. Ik kreeg dit idee van de uitstekende PeepCode? Advanced Command Line? screencast, die dit delen, evenals vele andere geweldige tips.

Om dit te doen, moeten we het script downloaden en bouwen dat deze informatie vindt. Ga naar de repository voor vcprompt, een script dat de versiebeheerinformatie uitvoert. Als u bekend bent met het Mercurial-versiecontrolesysteem, kunt u dat gebruiken om de repo te krijgen, maar u wilt waarschijnlijk die 'zip'-link gebruiken om de scriptcode als een zipbestand te downloaden. Zodra je het uitgepakt hebt, moet je het script bouwen. Om dit te doen, alleen CD in de uitgepakte scriptmap en voer de opdracht uit maken. Zodra deze opdracht wordt uitgevoerd, ziet u een bestand met de naam 'vcprompt' in de map. Dit is het uitvoerbare script.

Dus, hoe gebruiken we dit in onze prompt? Welnu, dit brengt een belangrijk konijn-spoor naar voren: hoe kunnen we? Installeren? een script (zoals dit) zodat we het in de terminal kunnen gebruiken? Alle opdrachten die u op de terminal kunt uitvoeren, bevinden zich in een gedefinieerde reeks mappen; deze array is de variabele PATH. U kunt een lijst met mappen die zich momenteel in uw PATH bevinden door uitvoeren echo $ PATH. Het ziet er ongeveer zo uit:

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

Wat we moeten doen is het uitvoerbare script plaatsen vcprompt in een map die op ons pad is. Wat ik leuk vind om te doen (en ja, ik heb deze truc ook geleerd van die PeepCode screencast) is een map aan te maken met de naam 'bin' (afkorting van 'binary') in mijn thuismap en die map toe te voegen aan mijn PATH. Voeg dit toe aan uw .bashrc:

PATH exporteren = ~ / bin: $ PATH

Hiermee wordt PATH ingesteld op ~ / Bin, plus wat er al in de variabele PATH zat. Als we dat nu zetten vcprompt script in ~ / bin, we zullen het in elke map op de terminal kunnen uitvoeren.

Dus laten we dit nu aan onze prompt toevoegen:

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

Ik heb toegevoegd $ txtpur% s naar de? sjabloon? string en heeft de vierde parameter toegevoegd"$ (Vcprompt)". Het gebruik van het dollarteken en haakje zal het script uitvoeren en de uitvoer retourneren. Nu krijg je dit:

Merk op dat als de map geen enkele vorm van versiebeheer gebruikt, er niets te zien is. Maar als we ons in een repository bevinden, krijgen we het versiebeheer-systeem dat wordt gebruikt (Git, in mijn geval) en de filenaam. U kunt deze uitvoer een beetje aanpassen, als u dat wilt: controleer het Leesmij-bestand dat u hebt gedownload met de broncode voor de vcprompt script.


Verder gaan!

Hier is onze compleet .bashrc of .bash_profile het dossier:

exporteren PATH = ~ / bin: $ PATH txtblk = "\ e [0; 30m" # Black - Regular txtred = "\ e [0; 31m" # Red txtgrn = "\ e [0; 32m" # Green txtylw = " \ e [0; 33m "# Geel txtblu =" \ e [0; 34m "# Blauw txtpur =" \ e [0; 35m "# Paars txtcyn =" \ e [0; 36m "# Cyaan 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 "# Gele bldblu =" \ e [1; 34m "# Blauwe bldpur =" \ e [1; 35m "# Paarse bldcyn =" \ e [1; 36m "# Cyaan bldwht =" \ e [1 ; 37m "# White unkblk =" \ e [4; 30m "# Black - Onderstrepen undred =" \ e [4; 31m "# Red undgrn =" \ e [4; 32m "# Green undylw =" \ e [4 ; 33m "# Yellow undblu =" \ e [4; 34m "# Blue undplu =" \ e [4; 35m "# Purple undcyn =" \ e [4; 36m "# Cyan undwht =" \ e [4; 37m "# White bakblk =" \ e [40m "# Black - Background bakred =" \ e [41m "# Red badgrn =" \ e [42m "# Green bakylw =" \ e [43m "# Yellow bakblu =" \ e [44m "# Blauwe bakpur =" \ e [45m "# Paarse bakcyn =" \ e [46m "# Cyaan bakwht =" \ e [47m "# Wit txtrst =" \ e [0m "# Tekst resetten print_before_the_prompt ()  printf "\ n $ txtred% s: $ bldgrn% s $ txtpur% s \ n $ txtrst" "$ USER" "$ PWD" "$ (vcprompt) " PROMPT_COMMAND = print_before_the_prompt PS1 =" -> "

Nou, dat is een spoedcursus over het aanpassen van je bash-prompt. Als je vragen hebt, zorg er dan voor dat je deze in de comments plaatst!