22. marraskuu 2010, 15:31

Bash-skriptailua ja värejä

Taas tuli esille pieni tarve kirjoittaa bash-skriptinpalasta, ja nyt tuntuu sujuvan vain paremmin kuin koskaan ennen. Sopivan värilistauksen ansiosta myös syötteen värjääminen (usein tarkoituksenmukaista) on nyt äärihelppoa. Kuinka kuitenkin organisoida skriptejä?

Vaikka olen zsh-shelliä käytellyt hyvän aikaa, skriptipuolella tyydyn bashiin erittäin hyvin parista syystä: bash-skriptaamiseen löytyy paremmat oppaat ja referenssit, bash-skriptit tavoittavat laajemman yleisön kuin zsh:n vastaavat, ja tärkeimpänä se, että bash-skriptejä osaan minäkin jotenkuten vääntää. Tärkeitä seikkoja nämä kaikki.

Tämänkertainen tarve oli tehdä skripti, joka kävisi annetun hakemiston musiikkikappaleet läpi ja tulostaisi kappaleiden metatiedot näkysälle nätissä muodossa. Voisin näin nopeasti tutkia, kaipaavatko kappaleet sitten tagien uudelleenhakemista raskaamman Easytag-ohjelman kanssa.

Lähdin ongelmanratkaisuun ottamalla vaikutteita vanhemmista projekteista: määritellään ensin mahdollisen tulevaisuuslaajentamisen mielessä pari helpottavaa muuttujaa.

dir="$1"
exts=( flac mp3 ogg )
rec=false

Voisin lisätä exts-listaan joitain myöhemmin käyttöönottamiani tiedostopäätteitä. Rekursiivista alihakemistojen käyntiä varten voisi olla rec. En ole kyllä varma, tukeeko bash totuusarvoja. En kyllä testannutkaan, koska nyt ei ole tarvetta sille. Se ei kuitenkaan haittaa modulaarisuutta tai myöhempää muokattavuutta, koska seuraavassa vaiheessa proseduraalista skriptinkäyntiä on helppoa laajentaa eteenpäin:

if [ ! -d "$dir" ]
then
    echo "Bad directory: \"$dir\""
    exit
fi

# jos rec käytössä, haetaan alihakemistoistakin
findopts=""
if [ ! rec ]; then
    findopts="-maxdepth 1"
fi

Kuten näkyy, find hoitaisi kyllä rekursiivisen haeskelun ihan yhden lisäflagin voimin. No, käydään sitten päätteitä ja tiedostoja läpi. Kaava on tuttu, mutta nyt löysin sattumoisin hauskan tavan käsitellä find-ulostuloa. Xargsin kanssa pitäisi olla oma bash-skripti, eikä esimerkiksi yksittäistä funktiota kai saa passitettua sinne.

# Käydään tiedostotyypit järjestyksessä läpi
for filetype in ${exts[*]}
do
    find $findopts "$dir" -type f -iname "*.$filetype" |sort|while read file
    do
        print_tags "$file"
    done
done

Tuollainen simppeli find-while-read -rakenne tekee kivasti. Sorttauksen lisääminen toimii niissä tapauksissa, joissa tiedostonimet alkavat raidan numerolla. Putkituksien käyttöhän on muuten varsin funktionaalista. Funktioiden yhdistelemistä ilman, että sen kummemmin tarvitsee ihmetellä taustalla piileviä matemaattisia ratkaisuja. Ulkoistin yksittäisen kappaleen tulostamisen vielä omaksi funktiokseen:

# Tulosta nätti rivi tageista
function print_tags {
    title=`taginfo "$1" | grep TITLE | sed -e "s/^.*=//" | sed -e "s/\"//g"`
    artist=`taginfo "$1" | grep ARTIST | sed -e "s/^.*=//" | sed -e "s/\"//g"`
    album=`taginfo "$1"  | grep ALBUM | sed -e "s/^.*=//" | sed -e "s/\"//g"`
    track=`taginfo "$1"  | grep TRACK | sed -e "s/^.*=//" | sed -e "s/\"//g"`
    year=`taginfo "$1"  | grep YEAR | sed -e "s/^.*=//" | sed -e "s/\"//g"`
    echo -en "("$album $bldgrn$year$txtrst")"
    printf "%3d. " $track
    echo -e $txtgrn$artist" - "$title$txtrst
}

Ehkä ei nätein tai tehokkain funktio maailmassa, koodi on kopioitu toisesta tageja käyttävästä ratkaisusta sellaisenaan. Tulostusta on muotoiltu värien kanssa, siitä seuraavassa osiossa. Värit ovat fantsusti muuttujina, joita voi vain konkatenoida echo-tulosteen mukaan. Helppoa värinhallintaa, jolla on käytettävyysetuja.

Värit

No, värit voi aina kirjoitella esc-koodeina, tai tallentaa käyttämänsä värit muuttujiin ja lisäillä merkkijonoina tulosteisiin. Tätä varten googlasin valmiin listan värejä. Arpa osui Arch Linuxin wikipalstalle, ja fiksu ratkaisu kun on, tekisi mieli saada nuo muuttujat jotenkin yleiskäyttöisesti esille. Muutenhan joutuisin aina kopioimaan listan skriptiin. Eikä bash-skriptien suoritus mahda ajella .bashrc:tä. Ja ympäristöt ovat muutenkin skripteille suljetut, joten oma .zshrc ei sekään auttane. No, ehkä löydän jotain, ehkä en. Eihän se iso vaiva ole kopioida tarvittaessa tiedostoon.

Tageja: ,

---
---

---

Aiheen vierestä