Bashin ulkoasu

Linux.fista
Versio hetkellä 19. maaliskuuta 2021 kello 11.25 – tehnyt LinuxMan (keskustelu | muokkaukset) (→‎Bashin sisäänrakennetut herkut)
(ero) ← Vanhempi versio | Nykyinen versio (ero) | Uudempi versio → (ero)
Siirry navigaatioon Siirry hakuun

GNU/Linuxin käyttäjät ovat omalaatuisia, jos ei muun kanssa niin ainakin oman Linuxin pitää olla persoonallinen. Työpöytien koristelu on monelle tuttua touhua tavalla tai toisella, mutta miten saisi vielä hieman koristeltua Linuxia? Helppoa, muokataan bash-komentotulkin komentokehotteen ulkoasua.

Pohjustusta aiheeseen

Monet ovat tottuneet käyttämään GNU/Linuxissa jotain graafista järjestelmää tietokoneensa hallintaan. Tehokasta ja yksinkertaista komentoriviä käytetään yhä paljon. Yleisin käytössä oleva komentotulkki on bash, joka mahdollistaa ulkoasunsa muokkaamisen melko laajasti.

Monesti käyttäjät huomaavat selkeitä puutteita bashin komentokehotteen ulkoasussa, se kun ei esimerkiksi näytä tiedostojen tai ajossa olevien prosessien lukumäärää. Joillekin taas käy silmään se sama ainainen "käyttäjä@konenimi>" -teksti. Nämä asiat voidaan kuitenkin korjata kevyellä ohjelmoinnilla joka on erittäin yksinkertaista - tarvitset vain bashin, tekstieditorin ja oikean asenteen.

Kevyt aloitus

Bashin komentokehotteen ulkoasun määrää bashin sisäinen muuttuja nimeltään PS1. Lisäksi on olemassa muuttujat PS2, PS3 ja PS4, mutta käsittelemme tässä vain PS1-muuttujaa jotta bashin ulkoasun säätäminen tulisi tutuksi. Muut muuttujat ovat samalla tavalla muokattavissa, joten jos mielenkiinto riittää, niin bashin man-sivuilta löydät lisätietoa näistä muuttujista. Niistä on kuitenkin tärkeää muistaa, että ne ovat kaikki ympäristömuuttujia - jos vaihdat niitä lennosta, ne vaikuttavat välittömästi komentokehotteeseesi. Kannattaa siis aluksi varmuuskopioida alkuperäinen PS1-muuttuja. Voit tallettaa sen toiseksi ympäristömuuttujaksi tai tiedostoon seuraavasti:

# Tallennus toiseen ympäristömuuttujaan nimeltä PS_SAVE. 
käyttäjä@kone$ PS_SAVE=$PS1  
#Tallennus varmuuskopio.txt-nimiseen tiedostoon käyttäen hyväksi stdout:ia 
käyttäjä@kone$ echo $PS1 > varmuuskopio.txt 

Näin meillä on aina vara muokata komentokehoteen ulkoasua ja mahdollisuus palauttaa alkuperäiset asetukset jos uudet asetukset eivät toimikaan halutulla tavalla. Kokeillaan palautusta ja muokkaamista asettamalla komentokehote @-merkiksi ja sen jälkeen takaisin normaaliksi:

# Asetetaan prompt "@"-merkiksi, eli syötetään PS1:lle arvo 
käyttäjä@kone$ PS1="@" 
# Kokeillaan uutta ulkoasua ls-komennolla ja 
# palautetaan alkuperäiseksi tallennetusta muuttujasta PS_SAVE 
@ ls mail 
documents public_html 
# Palautetaan muuttuja PS1 ympäristömuuttujasta PS_SAVE 
@ PS1=$PS_SAVE
käyttäjä@kone$ 


Nyt tiedämme kuinka muuttaa PS1:n sisältöä ja osaamme myös sen palauttaa siihen alkuperäisen arvon jos jokin menee pieleen.

Bashin sisäänrakennetut herkut

Jos haluamme esimerkiksi kellonajan näkymään bashin komentokehotteessa, on se suunnattoman koodirivistön takana... tai sitten ei. Bashissa on muutama sisäänrakennettu toiminto. Tässä niistä muutama, joita voimme käyttää tulevassa esimerkissämme. Lisää näistä löytyy bashin man-sivuilta.

Komento Kuvaus
\h Isäntänimi ensimmäiseen pisteeseen asti
\H Isäntänimi kokonaisuudessaan
\j Käynnissä olevien tehtävien lukumäärä
\n\r Rivinvaihto
\t Kellonaika 24h TT:MM:SS-formaatissa
\T Kellonaika 12h TT:MM:SS-formaatissa
\@ Kellonaika 12h AM/PM-formaatissa
\u Käyttäjänimi
\w Hakemistopolku senhetkiseen hakemistoon
\\ Kenoviiva
\[ Ei-tulostuvien merkkien aloitus
\] Ei-tulostuvien merkkien lopetus

No niin, kokeillaan sitten kuinka näitä käytetään. Asetetaan komenttokehotteeksemme vaikka kellonaika@käyttäjä:hakemistopolku hakasulkujen sisään. Tapahtuu seuraavalla tavalla (muista heittomerkit):

käyttäjä@kone$ PS1="[\t@\u:\w]" 
[10:42:33@käyttäjä:~/hakemisto]

Asetusten tallentaminen

Tässä vaiheessa moni varmaan jo miettii, että minä en halua joka kerta komentotulkkia käynnistäessä kirjoittaa tuota tekstiä saadakseni vähän erilaisen komentokehotteen. Onneksi tuota ei tarvitse joka kerta kirjoittaakaan. Aina, kun bash käynnistetään, se lukee asetukset mm. ~/.bash_profile-tiedostosta (tai ~/.bashrc-tiedostosta) joka sijaitsee käyttäjän kotihakemistossa. Teemme siis muokattua komentokehotetta varten oman tiedoston ja lataamme sen ~/.bash_profile-tiedoston kautta jatkuvaan käyttöön. Seuraavaksi esimerkki tiedostosta (tiedostonimi "kehote"), jolla saadaan normaali komentokehote ladattua automaattisesti bashin käynnistyessä.

#!/bin/bash
# Luodaan komentokehotetta varten funktio muuta_kehote 
function muuta_kehote { 
 # [käyttäjänimi@isäntänimi:hakemistopolku]$ 
 PS1="[\u@\h:\w]$"
} 

Seuraavaksi otamme tiedostossa olevan muokatun komentokehotteen käyttöön käyttämällä source-komentoa ja kutsumalla funktiota "muuta_kehote". Source lataa sille parametrina annetun tiedoston, jolloin tämän komennon ajamisen jälkeen äsken luomamme funktio löytyy.

käyttäjä@kone$ source kehote 
käyttäjä@kone$ muuta_kehote 
# Lopputulos
[käyttäjä@kone:~/temp]$ 

Jos tämä ei toimi kuten pitäisi niin varmista, että tiedostolla on suoritusoikeudet. Voit antaa sille suoritusoikeudet komennolla

chmod a+x kehote

Nyt meillä on tiedosto, joka voidaan ladata (komennolla source) ja funktio, jota voidaan sitten kutsua. Saamme muokattua komentokehotteen ulkoasua automaattisesti lisäämällä seuraavat rivit ~/.bash_profile-tiedostoon:

source /polku/tiedostoon/kehote
muuta_kehote

Väriä pintaan ja ulkoisten komentojen ajaminen

Haluamme varmaan hieman monipuolisuutta komentokehotteeseemme. Lisäämme siis siihen pienen ulkoisen ohjelman ajamisen. Otetaan esimerkiksi vaikka tiedostolaskuri, joka ottaa syötteenä ls -l -komennon tulosteen, putkittaa sen wc -l -komennolle ja tämän yhdistelmän (ls -l | wc -l) pitäisi antaa meille tiedostojen ja hakemistojen lukumäärän kansiossa, jossa olemme. Ulkoisten komentojen ajaminen tapahtuu aina $()-merkkisarjan sulkujen sisällä ja dollarimerkkiä ennen tulee olla kenoviiva. Voit ajaa käytännössä katsoen mitä vain komentoja näiden merkkien sisältä, putkittaa niitä, ohjata niiden tulosteita tiedostoihin tai antaa niille stdinin avulla tiedostoja argumenteiksi.

Uusi muuta_kehote-funktiomme voisi näyttää vaikka tältä

#!/bin/bash 
function muuta_kehote { 
# Lisätään kehotteen yläpuolelle ulkopuolinen komento 
# $()-merkkisarjan sisään ja sen loppuun rivinvaihto="\n\r" 
PS1="-=\$(ls -l | wc -l)=-\n\r[\u@\h:\w]$" } 

Ladataan nyt sourcella tiedosto ja kutsutaan funktiota muuta_kehote:

käyttäjä@kone$ source kehote 
käyttäjä@kone$ muuta_kehote 
#lopputulos näyttä jotakuinkin tältä 
-=40=- 
[käyttäjä@kone:~]$ 

Nyt osaamme siis liittää ulkopuolisia komentoja, mutta komentokehotteemme näyttää silti hieman keskeneräiseltä. Lisäämme siihen siis hieman väriä piristämään ulkoasua. Värikoodit joita käytämme, tulee aina laittaa \[\033[VÄRIKOODIm\]-merkkijonon sisään (kohtaan jossa lukee värikoodi). Muuten bash ei tajua niitä. Voit käyttää värikoodeja sellaisenaan tai tallentaa ne muuttujaan, jolloin niiden käyttö on huomattavasti vaivattomampaa. Alla olevassa taulukossa on listattu värikoodit.

Väri Koodi
Musta 0;30
Punainen 0;31
Vihreä 0;32
Ruskea 0;33
Sininen 0;34
Violetti 0;35
Syaani 0;36
Vaaleanharmaa 0;37
Tummanharmaa 1;30
Vaaleanpunainen 1:31
Vaaleanvihreä 1:32
Keltainen 1;33
Vaaleansininen 1;34
Vaaleanvioletti 1;35
Vaalea syaani 1;36
Valkoinen 1;37

Seuraavassa esimerkissä lisäämme vielä aikaisemmin tekemäämme komentokehotteen ulkoasua muuttavan funktioon muutamia värejä. Ensin teemme niistä paikallisia muuttujia, joiden nimiä voidaan käyttää värien tulostamiseen. Värit tulee asettaa voimaan ennen sitä tekstinpätkää, johon sen halutaan vaikuttavan, koska bashin fontin väri vaihtuu ruudulle tulostamisen ajaksi ja emme halua ylimääräisiä värejä komentokehotteeseemme. Värit myös jatkuvat siihen asti kunnes toinen väri määrätään. Huomaa komentokehotteen lopussa oleva $EI_VARIA-komento, jota ilman viimeksi annettu väri jäisi näkymään vielä kirjoitettavassakin tekstissä.

#!/bin/bash 
function muuta_kehote { 
 #asetetaan värit paikallisiin muuttujiin 
 local PUN="\[\033[0;31m\]" 
 local VPUN="\[\033[1;31m\]" 
 local SIN="\[\033[0;34m\]" 
 local VSIN="\[\033[1;34m\]" 
 local VALK="\[\033[1;37m\]" 
 local EI_VARIA="\[\033[0m\]" 
 # Lisätään väriä komentokehotteeseemme. Huomaa, että muuttujat lisätään aina 
 # dollarimerkki edessä 
 PS1="$VSIN-$SIN=$VALK\$(ls -l | wc -l)$SIN=$VSIN-\n\r[$PUN\u$VALK@$PUN\h$V\w$SIN]$VALK$ $EI_VARIA" 
} 

Nyt vain lataat tiedoston sourcella ja ajat funktion muuta_kehote, ja komentokehote on entistä ehompi ja värikkäämpi.

Lopuksi

Tässä artikkelissa on kerrottu perusasiat komentokehotteen ulkoasun muokkaamisesta. Vain mielikuvitus on rajana tehdessäsi itsellesi persoonallista komentokehotetta. Muista myös bashin man-sivut jotka auttavat ongelmissa ja tarjoavat elintärkeää lisätietoa.

Katso myös