Modifisering av Bash-prompt

Modifisering av Bash-prompt

Den vanlige hvit på svart konsollen kan bli kjedelig i lengden. Hva med å sprite den opp med litt farger eller å få litt mer informasjon ut av en vanlig shell bash? Denne guiden viser deg hvordan.

Merk at denne guiden baserer seg på shell-typen bash. Det finnes andre typer som for eksempel ZSH.

Det første du tenkte når du så denne innledningen var kanskje hva dette er for noe og hva er vitsen med det? Jo, det kan være mange grunner til det. Folk som har drevet med programmering vet godt hvordan det hjelper når de forskjellige kommandoene får farger. Alt blir så mye enklere å oppfatte. Slik er det med konsoll også. Når alt er i standard fargene hvit på svart kan ting lett overses. Men med en liten “modding” kan du få hvilke farger du vil.

Vi går rett på sak. Vi tar min egen standard prompt som eksempel. Den viser nå:

are@localhost /home

Dette er standard hos de fleste. Men hva er det som står bak disse ordene? Det skal vi nå se nærmere på. For å få fram denne standard prompten er denne kommandolinjen brukt:

\\u@\\h \\w

Denne er egentlig ganske enkel. Tegnene \\u skriver ut hvilken bruker du kjører som. @ som de fleste datafolk vet, står for det engelske ordet at (på) og brukes her til å vise hvor du sitter. \\h viser nemlig ditt hostnavn. Til slutt har vi \\w. Den vises hvilken mappe som er aktiv.

Lengre oppe her så du at jeg var i mappen /home. Derfor ble det skrevet i min prompt. Det finnes mange slike variabler. Her har du en liste over dem:

\\aDette vil få PCen til å lage et pip. Stilig, men irriterendes i lengden.
\\dViser datoen i dette formatet: “Ukedag Måned Dato”
\\hViser hostnavn
\\HDenne er helt lik som \\h, bare at her vises hele hostnavn inkludert domenet.
\\nMed denne vil du hoppe ned til neste linje.
\\sViser hvilket shell du bruker.
\\tViser tiden i 24 timer i dette formatet: HH:MM:SS.
\\TViser tiden i 12 timer i dette formatet: HH:MM:SS.
\\@Viser tiden i 12 timer am/pm format.
\\uViser hvilken bruker du kjører som.
\\WViser hvilken mappe du er i.
\\wSamme som \\W, bare at her vises hele URL til mappa.
\\vVersjonen av din bash. F.eks. 2.00.
\\VUtvidet info av din bash versjon. F.eks. 2.00.0
\\!Viser antall kommandoer du har i historie fila di.
\\#Viser hvor mange kommandoer du har kjørt i aktivt shell.
\\$Hvis du har uid 0 (root) vil den vise tegnet #. Hvis ikke vil den vise tegnet $.
\\nOKViser de to bokstavene “OK”. Her kan du ha hvilke bokstaver du vil.
\\jViser hvor mange prosesser brukere har.

Med alle disse variablene går det fint å mikse fram en stilig og informativ kommandoprompt. La oss ta et eksempel:

[ \\t@\\d \\u@\\h \\w ]\\n

Med denne koden får du en ikke så stilig, men informativ kommandoprompt som viser full dato, tid, bruker, host, mappe og det hoppes ned en linje slik at du har mest mulig plass på å skrive kommandoer. Jeg liker ikke å måtte dele opp en kommando på flere linjer selv om det blir nødvendig i mange tilfeller.

Hvordan får du så disse til å fungere? Det skal jeg nå fortelle deg. Nå skal vi først sjekke om prompt’en vi kommer fram til duger. Før vi setter den som standard.

I konsoll skriv: PS1=”

Da vil du automatisk få se hvordan resultatet blir. Merk at når du bruker PS1 slik, vil ikke stilen lagres, og med en gang du skriver exit eller restarter vil du gå tilbake til standard.

Skriv: PS1=”[ \\t@\\d \\u@\\h \\w ]\\n” for å få fram forrige eksempel.

En feil som mange gjør, er å glemme av ” på slutten. Da får du dette:
>

Farger

På tide med litt farger. Det blir noe trist med svart/hvit i disse lyse sommerdager. For å få farger skriver du dette i konsoll:

PS1=”\\[\\033[\\]\\[\\033[0m\\]“

Dette systemet kan virke veldig tungvint, men etter et par ganger kan du det utenat. Her har du en liste over de fleste farger:

Svart0;30mHvit1;37m
Blå0;34mLyseblå1;34m
Grønn0;32mLysegrønn1;32m
Mørk turkis0;36mTurkis1;36m
Rød0;31mMørkerød1;31m
Lilla0;35mRosa1;35m
Brun0;33mGul1;33m
Lysegrå0;37mMørkegrå1;30m

Som du ser følger disse fargene et system. Med disse i bakhodet er det enkelt å mikse fram andre farger. La oss ta enda et eksempel, denne gang med farger:

PS1=”\\[\\033[1;37m\\][\\[\\033[0m\\]\\[\\033[1;32m\\] \\t\\[\\033[0m\\]\\[\\033[1;30m\\] | \\[\\033[0m\\]\\[\\033[0;31m\\] \\u@\\h\\[\\033[0m\\]\\[\\033[1;36m\\] \\w\\[\\033[0m\\]\\[\\033[1;37m\\] ]\\[\\033[0m\\]“

Dette vil få fram en slik kommandopromt:

Du kan også “highlighte” en tekst. Det betyr at du skifter bakgrunnsfarge. La oss ta et eksempel:

PS1=”\\[\\033[41m\\]Rød bakgrunn med standard farget tekst.\\[\\033[0m\\]“

Dette blir da output:

Rød bakgrunn med standard farget tekst.

Som du der så bruker vi en litt annen fargekode. Her er en liste:

Rød41m
Grønn42m
Brun43m
Blå44m
Lilla45m
Turkis46m
Grå47m

Skal du ha selve teksten i annen farge må du bruke en slik kode:

PS1=”\\[\\033[1;32;41m\\]Grønn på blå\\[\\033\\[0m\\]“

Altså: “\\[\\033[;\\]tekst\\[\\033[0m\\]“

Mer avanserte prompt’er

Eksemplene over er egentlig ganske standard. I dette avsnittet skal vi komme inn på hvordan du kan lage noen mer avanserte. Dette eksempelet er litt mer fascinerende, her kan vi nemlig bestemme selv hvilket format datoen skal vises i:

PS1=”[\\$(date +%H%M)][\\u@\\h:\\w]\\$”

I stedet for å bruke variabelen \\t, bruker vi her (date +%H%M). Dette gjør oss i tilstand til å velge selv om vi vil ha med H (timer) M (minutter) og S (sekunder).

Det går også an å inkludere andre script. Med script kan du gjøre det aller meste. Kan jo nevne ting som f.eks. et script som viser hvor mye plass du har i en mappe, hvor lenge PCen din har vært på, forskjellige tilbakemeldinger avhengig av resultat på kommando og mye mer. Bruk fantasien! Dessuten finnes det en rekke ferdig script der ute på nettet. Selv om jeg ikke skal forklare hvordan du skriver script i denne guiden har jeg lagt ved et script:

#!/bin/bash

# $Author: giles $, $Date: 1998/12/23 05:16:22 $ # $Source: /home/giles/.bashprompt/bashthemes/RCS/clock,v $, # $Revision: 0.18 $

function prompt_command {
let prompt_x=$COLUMNS-5
}

PROMPT_COMMAND=prompt_command

function clock {
local BLUE="\\[\\033[0;34m\\]"
local RED="\\[\\033[0;31m\\]"
local LIGHT_RED="\\[\\033[1;31m\\]"
local WHITE="\\[\\033[1;37m\\]"
local NO_COLOUR="\\[\\033[0m\\]"
case $TERM in
xterm*)
TITLEBAR=’\\[\\033]0;\\u@\\h:\\w\\007\\]’
;;
*)
TITLEBAR=""
;;
esac

PS1="${TITLEBAR}\\
\\[\\033[s\\033[1;\\$(echo -n \\${prompt_x})H\\]\\ $BLUE[$LIGHT_RED\\$(date +%H%M)$BLUE]\\[\\033[u\\033[1A\\] $BLUE[$LIGHT_RED\\u@\\h:\\w$BLUE]\\ $WHITE\\$$NO_COLOUR "
PS2=’> ‘
PS4=’+ ‘
}

Lagre dette i en fil og skriv:
Chmod 755
./

Merk at dette scriptet bruker ANSI-kode. Det er derfor ikke alle Linux-versjoner som har automatisk støtte for dette. Eksempelscriptet er tatt fra Gilesorr.com. Der finner du også mange andre eksempler.

Forskjellige forslag

Den stilige
PS1=”\\[\\033[0m\\]|\\[\\033[1;33m\\]- \\t -\\[\\033[0m\\]|\\[\\033[1;32m\\]- \\u -\\[\\033[0m\\]|\\[\\033[0;31m\\]- \\w -\\[\\033[0m\\]|\\[\\033[1;30m\\]“

Som du ser får denne fram en del farger, mindre info, men bedre enn standard. Mørk grå tekst fortsetter i stedet for standard hvit.

Den fargerike
PS1=”\\[\\033[32;41m\\] \\d \\[033[0m\\]\\[\\033[34;46m\\] \\t \\[\\033[0m\\]\\[\\033[30;42m\\] \\u \\[\\033[38;45\\] \\w \\ [\\033[0m\\]“

I dette eksempelet har jeg ikke nøyd meg med bare “highlight” av bokstavene, men ville at bokstavene selv skulle ha egne farger. F.eks. datoen vises grønt på rødt. Ikke så informativ, men ganske så fargerik.

Den informative
PS1=”[ \\[\\033[0;31m]\\u@\\H\\[\\033[0m\\] ]\\n[ Jobber i \\[\\033[0;31m\\]\\W\\[\\033[0m\\] kl \\[\\033[0;31m\\]\\t\\[\\033[0m\\] den \\[\\033[0;31m\\]\\d\\[\\033[0m\\] ]\\n[Du har utført \\[\\033[0;31m\\]\\#\\[\\033[0m\\] handlinger i dette shellet ]\\n\\$”

[ are@localhost ]
[ Jobber i /home kl 10:10:10 den Thu Jun 24 ]
[ Du har utført
 15 handlinger i dette shellet ]
$

Denne liker jeg personlig godt ved at den gir god informasjon enkelt og greit.

Den symmetriske
PS1=”\\[\\033[46m\\] \\[\\033[0m\\]\\[\\033[43m\\] \\u
\\[\\033[0m\\]\\[\\033[0;36;46m\\] \\w \\[\\033[0m\\]\\n\\[\\033[43m\\] \\t
\\[\\033[0m\\]\\[\\033[0;30;46m\\] :) \\[\\033[0m\\]\\[\\033[43m\\] \\w
\\[\\033[0m\\]\\n\\[\\033[46m\\] \\[\\033[0m\\]\\[\\033[43m\\] \\$
\\[\\033[0m\\]\\[\\033[0;36;46m\\] \\w \\[\\033[0m\\]\\n”

              are             
 10:10:10     :)      /home   
              $      

Denne er ikke særlig funksjonell, men kun en demonstrasjon på hvordan du kan gjøre dette. Det som er dårlig med denne, er at fargelengden blir feil ettersom hvilken mappe du er i. Det har jeg halvveis rettet opp med å la alle disse fargeboksene til høyre inneholde \\w, men dette er ikke en spesiell god ting å gjøre. Du bør heller bruke et script til dette, men dette var bare et eksempel på ekstrem fargebruk.

Lagre din bash prompt

Som du kanskje allerede har erfart vil ikke kommandoen PS1=”" lagre stilen din. Med en gang du logger ut går det tilbake til standard. Skal du lagre din egen stil slik at den blir aktiv hver gang du logger på må du redigere en fil. Men denne filen er ikke det samme for alle sammen. Hos deg kan det være en helt annerledes fil enn hos meg. De mest vanlige filene er: etc/profile, /etc/bashrc, ~/.bash_profile, eller ~/.bashrc. Som mange av dere sikkert vet står ~ for din hjemmekatalog. Min .bashrc fil ligger eksempelvis her: /home/are/.bashrc

Til meg er det filen /etc/bashrc som må redigeres og derfor vil den filen gå som et eksempel her. De andre filene er ikke særlig annerledes og du skal lett klare å redigere de på samme måte. Som vanlig bruker jeg Nano til å redigere filer via konsoll. I konsoll skriv (husk å være root):

nano /etc/bashrc

Du vil få opp selve filen, og er klar til å redigere den. Ca. midt i dokumentet ser du linjen:
[ "$PS1"= "\\\\s-\\\\v\\\\\\$ " ] && PS1=”[\\u@\\h \\w] “

Som du kanskje husker var koden [\\u@\\h \\w] standard prompt’en. Der er her du skal redigere den slik du vil. Jeg redigerer min til dette:

[ "$PS1"= "\\\\s-\\\\v\\\\\\$ " ] && PS1=”\\[\\033[1;37m\\][\\[\\033[0m\\]\\[\\033[1;32m\\] \\t\\[\\033[0m\\]\\[\\033[1;30m\\] | \\[\\033[0m\\]\\[\\033[0;31m\\] \\u@\\h\\[\\033[0m\\]\\[\\033[1;36m\\] \\w\\[\\033[0m\\]\\[\\033[1;37m\\] ]\\[\\033[0m\\] “

Og trykker ctrl-x for å lukke dokumentet. Jeg blir bedt om å lagre, og selvfølgelig skal jeg det. Forandringene vil ikke tre i kraft umiddelbart slik det gjør når du skriver PS1=” i konsoll. Du må logge ut og inn igjen.

Også i denne sjangeren finnes det snarveier. Simple programmer som gjør ting enklere er som oftest som sendt fra himmelen. Bashish er intet unntak Dette programmet skal også fungere under andre shell-typer. Det finnes en rekke slike programmer, men det fins også Java-løsninger som for eksempel denne. Personlig bruker jeg ingen av disse til vanlig.

Etter denne guiden håper jeg du har lært noe. De som allerede er kjent med dette har sikkert masse å tilføye, men jeg mener selv at jeg fikk med det mest essensielle for en nybegynner her. Det mer avanserte med script kan man lære seg etterpå. Det er faktisk moro med litt konsollarbeid, er det ikke?