Modul de personalizare a liniei de comandă

Sunt un mare fan al terminalului: dacă utilizați o mână de comenzi (sau mai mult!) Pentru a vă îmbunătăți procesul de dezvoltare sau doar pentru a vă deplasa rapid în jurul unităților și a deschide fișiere și foldere, linia de comandă este un instrument minunat. Cu toate acestea, dacă o utilizați frecvent, veți dori să o personalizați în funcție de nevoile dvs. Îți arăt cum să faci asta astăzi!

M-am întrebat adesea: "Cum ți-ai primit promptul de comandă să arăți așa?" Ei bine, în acest tutorial, vă voi arăta exact cum să faceți acest lucru. Este destul de simplu și nu va necesita prea mult timp.

Ar trebui să observ că ceea ce vă arăt este specific pentru coajă bash; aceasta este shell-ul implicit pe Mac și majoritatea sistemelor Linux. Dacă doriți o comandă de bash pe Windows, este posibil să doriți să verificați Cygwin.


Cum functioneazã?

Înainte de a începe, hai să vorbim un minut despre cum personalizați solicitarea de bash. Nu este exact același lucru ca și când sunteți o aplicație medie: nu există panou de preferințe. Personalizările dvs. sunt stocate într-un fișier. Dacă sunteți pe Linux (sau folosind Cygwin), acesta va fi dvs. .bashrc fişier; pe Mac, asta e al tău .bash_profile fişier. În ambele cazuri, acest fișier este păstrat în directorul dvs. de acasă (dacă nu sunteți sigur unde este instalat Cygwin, executați comanda echo $ HOME). Rețineți că mă voi referi doar la .bashrc fișier de aici de pe afară, dar utilizați .bash_profile dacă sunteți pe un Mac.

Rețineți că pe Mac (și posibil mașinile Linux, nu sunt sigur), fișierele care încep cu o perioadă sunt ascunse în mod implicit. Pentru a le arăta, rulați aceste două linii în terminal

implicite scrie com.apple.finder AppleShowAllFiles TRUE killall Finder

Deci, ce se întâmplă în asta .bashrc fişier? Fiecare linie este de fapt o comandă pe care ați putea rula pe linia de comandă. De fapt, așa funcționează aceste fișiere de configurare: Când deschideți consola, toate comenzile pe care le-ați scris în fișierul de configurare sunt executate, configurați mediul. Deci, dacă doriți doar să încercați câteva din ceea ce voi arăta mai jos, doar tastați-o pe linia de comandă însăși. Simplitatea de aici este frumoasă.


Personalizarea PS1

Să începem cu o definiție. prompt este ceea ce vedeți la începutul liniei, de fiecare dată când apăsați Enter pe linia de comandă. Iată setările implicite pentru Mac:

În acest caz, promptul este andrews-macbook: ~ screencast $. Există câteva variabile aici: andrew-macbook este numele acestui computer, ~ este directorul curent (directorul de acasă) și screencast este numele de utilizator. Să o particularizăm puțin.

Deschideți fie dvs. .bashrc fişier. Modul în care setăm ce informații se afișează în prompt este cu PS1 variabil. Adăugați aceasta la fișier:

PS1 = '->'

Observați că nu pun spații pe nici o parte a semnalului egal; este necesar. Salvați acest fișier în directorul dvs. de acasă și deschideți din nou o fereastră terminală. Acum, ar trebui să aveți un prompt care arată astfel:

Voi nota aici că, dacă vi se pare dificil să închideți și să vă re-deschideți terminalul de fiecare dată când faceți o schimbare la dvs. .bashrc sau .bash_profile, există o scurtătură: Puteți încărca orice fișier de personalizare bash cu sursă comanda. Rulați acest lucru în terminalul dvs.:

sursă ~ / .bashrc

Încă prea mult timp? Ei bine, o singură perioadă (.) este un alias pentru sursă. Fericit acum? Dacă sunteți rapid, veți realiza că putem folosi sursă comanda pentru a include alte fișiere în cadrul nostru .bashrc fișier, dacă doriți să îl împărțiți pentru a vă menține sub control.

Să ne personalizăm promptul mai mult. Putem folosi variabile încorporate în șirul pe care îl atribuim PS1 pentru a include informații utile în solicitare; aici este ceva util:

  • \ d: Data
  • \ h: Gazda
  • \ n: Linie nouă
  • \ t: Timpul
  • \ u: Nume de utilizator
  • \ W: Directorul curent de lucru
  • \ w: Calea completă către directorul curent

Deci, dacă vă stabiliți promptul la acest lucru:

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

ar trebui să vedeți ceva de genul:

Observați câteva lucruri aici: în primul rând, folosim o grămadă de variabile prezentate mai sus pentru a ne oferi mai multe informații. În al doilea rând, vom include câteva linii noi acolo și vom primi un mesaj mai interesant: avem directorul curent pe o singură linie și apoi promptul real pe următoarea linie. Prefer preferința mea în acest fel, pentru că am întotdeauna aceeași cantitate de spațiu pentru a scrie comenzile mele, indiferent cât timp este calea spre directorul curent. Cu toate acestea, există o modalitate mai bună de a face acest lucru, așa că haideți să ne uităm la asta acum.


Personalizarea PROMPT_COMMAND

Cea mai bună modalitate de a face acest lucru este utilizarea PROMPT_COMMAND variabil; conținutul acestei variabile nu este doar un șir, ca și cu PS1. Este de fapt o comandă care a executat înainte ca bash să afișeze promptul. Pentru a face acest lucru, încercați să adăugați acest lucru la adresa noastră .bashrc:

PROMPT_COMMAND = 'echo' vine înainte de promptul ''

Folosim ecou comanda aici; dacă nu sunteți familiarizat cu aceasta, trebuie să-i dați un șir, iar acesta îl va scrie terminalului. Prin ea însăși, nu este foarte util (deși îl puteți folosi pentru a vedea variabilele: echo $ PS1), dar este minunat atunci când este utilizat cu alte comenzi, astfel încât să afișeze rezultatele lor. Dacă ați adăugat linia de mai sus, ar trebui să vedeți acest lucru:

Să facem ceva mai util aici. Să scriem o funcție bash pe care o vom aloca PROMPT_COMMAND. Incearca asta:

print_before_the_prompt () echo "vine înainte de prompt" PROMPT_COMMAND = print_before_the_prompt

Dacă utilizați acest lucru, nu ar trebui să vedeți o diferență în solicitarea dvs. din cele de mai sus. Acum, hai să facem asta util.

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

Iată ce veți obține:

E un început bun, dar vreau să fac ceva mai mult. O să folosesc printf comanda în loc de ecou deoarece face ca liniile noi și variabilele să fie mai ușor de realizat. Un fundal rapid pe printf comandă: este nevoie de mai mulți paramtere, primul fiind un fel de șablon pentru șirul care va fi afișat. Ceilalți parametri sunt valori care vor fi înlocuite în șirul de șablon dacă este cazul; vom vedea cum funcționează acest lucru.

Deci, să facem acest lucru:

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

Vedeți asta % s părți acolo? Asta inseamna? Interpreta valoarea pentru acest loc ca un sir ?; pentru context, am putea folosi de asemenea % d pentru a formata valoarea ca număr zecimal. După cum puteți vedea, avem două % ss în șablonul? string și doi alți parametri. Acestea vor fi plasate în șirul în care % ss sunt. De asemenea, observați noile linii de la începutul și sfârșitul lor: primul oferă doar terminalului o cameră de respirație. Ultimul se asigură că promptul (PS1) va fi imprimat pe următoarea linie, și nu pe aceeași linie ca PROMPT_COMMAND.

Ar trebui să obțineți un terminal astfel:


Adăugarea unei anumite culori

Arata bine! Dar hai să mergem cu un pas mai departe. Să adăugăm o anumită culoare la asta. Putem folosi anumite coduri speciale pentru a schimba culoarea textului în terminal. Poate fi destul de dificil să folosiți codul real, așa că îmi place să copiez această listă de variabile pentru culoare și să o adaug în partea de sus a paginii .bashrc fişier:

txtblk = '\ e [0; 30m' # Negru - Regular txtred = "\ e [0; 31m" # Red txtgrn = "\ e [0; 32m" txtblu = "\ e [0; 34m" # Blue txtpur = "\ e [0; 35m" # Purple txtcyn = "\ e [0; 36m" # Cyan txtwht = "\ e [1; 30m" # Negru - Bold bold = "\ e [1; 31m" # Red bldgrn = "# # # # # # # # # # # # # # # # # # # # # # e [4; 30m "# Negru - Subliniere nedeterminată =" \ e [4; 31m "# Red undgrn =" \ e [4; 32m "# Green undylw = e [4; 34m "# Blue undpur =" \ e [4; 35m "# Purple undcyn =" e [4; 36m "# Cyan undwht = 40m "# Black - Background baked =" \ e [41m "# Red badgrn =" \ e [42m "# Green bakyl = e [45m "# Purple bakcyn =" \ e [46m "# Cyan bakwht =" \ e [47m "# White Text ="

Există o metodă pentru această nebunie: Primul set se transformă în colorare normală. Cel de-al doilea set se transformă în culori îndrăznețe. Al treilea set activează colorarea subliniată. Și cel de-al patrulea set de culori de fundal. Ultimul reinițializează colorarea la normal. Deci, hai să le folosim!

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

Aici, am adăugat $ txtred înainte de prima % s, și $ bldgrn înainte de al doilea % s; apoi, la final, am resetat culoarea textului. Trebuie să faceți acest lucru deoarece, odată ce ați setat o culoare, va rămâne până când veți utiliza fie o culoare nouă, fie veți reseta colorarea. De asemenea, veți observa că atunci când setăm o variabilă, nu o prefixăm cu un semn de dolar; dar folosim semnul dolarului atunci când folosim variabila: așa funcționează variabilele bash. Acest lucru ne oferă următoarele:

Să trecem la pasul final: adăugând niște script-uri pentru a ne oferi mai multe informații.


Adăugarea informațiilor de control al versiunii

Dacă ați văzut serialele de emisiuni care vin împreună cu cartea "Noțiuni de bază bune cu Git", s-ar putea să vă amintiți că am câteva informații despre controlul versiunii afișate în promptitudinea mea. Am primit această idee de la linia avansată de comandă PeepCode? screencast, care împărtășesc acest lucru, precum și multe alte sfaturi utile.

Pentru a face acest lucru, va trebui să descărcați și să construiți scriptul care găsește aceste informații. Deplasați-vă la depozit pentru vcprompt, un script care transmite informațiile de control al versiunii. Dacă sunteți familiarizat cu sistemul de control al versiunii Mercurial, îl puteți folosi pentru a obține repo, dar cel mai probabil doriți să atingeți acel link "zip" pentru a descărca codul de script ca fișier zip. Odată ce îl dezarhivați, va trebui să construiți scenariul. Pentru a face asta, doar CD în folderul de script dezarhivat și executați comanda face. Odată ce această comandă rulează, ar trebui să vedeți un fișier numit "vcprompt" în dosar. Acesta este scriptul executabil.

Deci, cum folosim acest lucru în promptitudinea noastră? Ei bine, acest lucru aduce un important traseu de iepure: cum să instalăm? un script (ca acesta), astfel încât să îl putem folosi în terminal? Toate comenzile pe care le puteți rula pe terminal se găsesc într-o gamă definită de foldere; această matrice este variabila PATH. Puteți să vedeți o listă a folderelor care se află în mod curent pe PATH, rulând echo $ PATH. Poate arata cam asa:

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

Ceea ce trebuie să facem este să punem scriptul executabil vcprompt într-un dosar care este în calea noastră. Ceea ce îmi place să fac (și da, am învățat acest truc de la ecranul PeepCode, de asemenea) este să creezi un director numit "bin" (scurt pentru "binar") din directorul meu de acasă și să adaug acel dosar PATH-ului meu. Adăugați-o la dvs. .bashrc:

export PATH = ~ / bin: $ PATH

Aceasta setează PATH la ~ / Bin, plus ceea ce era deja în variabila PATH. Dacă o să punem acum asta vcprompt script în ~ / bin, vom putea să îl executăm în orice folder de pe terminal.

Deci, acum să adăugăm acest lucru promptului nostru:

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

am adăugat $ txtpur% s la șablonul? string și a adăugat al patrulea parametru"$ (Vcprompt)". Folosind semnul dolar și paranteza se va executa scriptul și se va întoarce ieșirea. Acum, veți obține acest lucru:

Rețineți că, dacă folderul nu utilizează un fel de control al versiunii, nu apare nimic. Dar, dacă suntem într-un depozit, obținem sistemul de control al versiunilor care este utilizat (Git, în cazul meu) și numele filialei. Puteți personaliza această ieșire un pic, dacă doriți: verificați fișierul Readme pe care l-ați descărcat cu codul sursă pentru vcprompt scenariu.


Trecând peste!

Iată-ne complet .bashrc sau .bash_profile fişier:

export PATH = ~ / bin: $ PATH txtblk = "\ e [0; 30m" # Negru - Regular txtred = "\ e [0; 31m" # Red txtgrn = \ e [0; 33m "# Yellow txtblu =" \ e [0; 34m "# Blue txtpur =" \ e [0; 35m "# Purple txtcyn =" \ e [0; 36m "# Cyan txtwht = [0; 37m "# White bldblk =" \ e [1; 30m "# Negru - Bold bold =" \ e [1; 31m "# Red bldgrn = [1; 33m "# Yellow bldblu =" \ e [1; 34m "# Blue bldpur =" \ e [1; 35m "# Purple bldcyn = ; 37m "# White unkblk =" \ e [4; 30m "# Negru - Subliniere nedeterminată =" \ e [4; 31m "# Red undgrn =" \ e [4; 32m "# Green undylw = ; 33m "# Yellow undblu =" \ e [4; 34m "# Blue undpur =" \ e [4; 35m "# Purple undcyn =" e [4; 36m "# Cyan undwht = "# # White # # # Black # # Black # # Black # # # # # # # # [44m "#Blue bakpur =" \ e [45m "# Purple bakcyn =" \ e [46m "# Cyan bakwht =" \ e [ printf "\ n $ txtred% s: $ bldgrn% s $ txtpur% s \ n $ txtrst" "$ USER" "$ PWD" "$ (vcprompt) " PROMPT_COMMAND = print_before_prompt PS1 =" -> "

Păi, asta e un curs de prăbușire pentru personalizarea promptului tău de bash. Dacă aveți întrebări, asigurați-vă că le scăpați în comentarii!

Cod