Ero sivun ”Pacman” versioiden välillä

Linux.fista
Siirry navigaatioon Siirry hakuun
p (source->syntaxhighlight)
 
(6 välissä olevaa versiota samalta käyttäjältä ei näytetä)
Rivi 1: Rivi 1:
Komentorivi on jo yksinään [[Komentorivin perusteet|monipuolinen]] työkalu, mutta skriptien avulla on mahdollista toteuttaa huomattavasti monipuolisempia prosesseja pienellä vaivalla. Tässä oppaassa käsitellään skriptien kirjoittamista [[bash]]-[[komentotulkki|komentotulkille]].
{{pienaakkonen}}
{{Ohjelma
| nimi          = pacman
| kuva          =
| kuvateksti    =
| lisenssi      = [[GPLv2+]]
| käyttöliittymä = teksti
| kotisivu      = [https://www.archlinux.org/pacman/ archlinux.org/pacman]
| lähdekoodi    = [git://git.archlinux.org/pacman.git git.archlinux.org/pacman.git]
}}


== Alkuun ==
'''<tt>pacman</tt>''' on [[Arch Linux]]in sekä siihen pohjautuvien jakeluiden kuten [[Manjaro]]n ja [[Parabola GNU/Linux-libre]]n kuten myös [[Slackware]]:n sukulaisjakelu [[Frugalware]]n käyttämä [[paketinhallinta]]ohjelma, jolla hallitaan järjestelmään asennettuja ohjelmapaketteja. Siinä on tuki riippuvuuksien hallintaan sekä kyky ottaa yhteys etäpalvelimeen ja automaattisesti päivittää, asentaa tai poistaa paketteja. Myös paikallisten pakettien asentaminen on mahdollista. Koska valitsimet ovat yhden kirjaimen mittaisia, <tt>pacman</tt>illa on verrattaen nopea kirjoittaa, jopa monimutkaisia komentoja verrattuna esimerkiksi [[Debian]]-pohjaisten jakeluiden käyttämin [[Apt]]-paketinhallintaohjelmiin.
Skripti aloitetaan rivillä
<syntaxhighlight lang="bash">
#!/bin/bash
</syntaxhighlight>
Joka kertoo, että skripti suoritetaan käyttäen bashia riippumatta siitä, mitä komentotulkkia käyttäjä käyttää ajaessaan skriptin. Huomaa, että vaikka rivi alkaa #-merkillä, se ei ole kommentti. Muualla skriptissä #:llä alkavat rivit ovat kommentteja, eikä niitä huomioida.


Skriptejä ei kuitenkaan ole pakko kirjoittaa erilliseen tiedostoon, vaan ne voi kirjoittaa myös suoraan komentoriville. Tällöin eri komentojen väliin laitetaan erottimeksi puolipiste (;).
Arch Linuxin paketit ovat [[gzip]]attuja [[tarball]]eja ja Frugalwaren paketit [[bzip2]]-pakattuja tarballeja. Tiedostopäätteenä Arch Linuxin paketeissa on <tt>.pkg.tar.gz</tt> ja Frugalwaren paketeissa <tt>.fpm</tt>. <tt>pacman</tt>in [[asetustiedostojen perusteet|asetustiedosto]] on <tt>[[pacman.conf|/etc/pacman.conf]]</tt>.


=== Ensimmäinen skripti ===
Frugalware on nykyisin siirtynyt käyttämään alkuperäisen Arch Linuxin <tt>pacman</tt>in sijaan uudelleenkirjoitettua <tt>pacman</tt>-versiota nimeltä pacman-G2. pacman-G2 on syntaksiltaan käytännössä samanlainen kuin alkuperäinen <tt>pacman</tt> [http://frugalware.org/docs/stable/pacman-g2.html].
Tehdään aluksi yksinkertainen skripti, joka esittelee muutamia perustoimintoja:
<syntaxhighlight lang="bash">
#!/bin/bash
echo "Hei, $(whoami), mitä kuuluu"
echo "Olet hakemistossa $(pwd), tiedostolistaus:"
ls
</syntaxhighlight>
Kuten huomaat, skripteissä käytetään tavallisia komentorivikomentoja, jotka sitten suoritetaan järjestyksessä. Toisaalta kuten myöhemmin huomaamme, skriptit tarjoavat paljon enemmän mahdollisuuksia kuin pelkkä komentojen näpyttely konsoliin.


Tallenna skripti vaikka nimellä <tt>eka.sh</tt> (sh-päätettä käytetään yleensä skriptien kanssa), anna sille [[chmod|suoritusoikeudet]] ja aja skripti, jolloin tulostus on suunnilleen seuraavanlainen:
== Historia ==
Hei, käyttäjä, mitä kuuluu
Olet hakemistossa /home/kayttaja/ohjelmointi/skriptit, tiedostolistaus:
eka.sh
Esimerkistä nähdään heti muutama perusasia. Ensinnäkin toisella rivillä käytetään ohjelmaa [[whoami]], joka tulostaa käyttäjänimen. Kun ohjelma on $()-merkinnän sisällä, kyseiseen kohtaan "kopioidaan" ajetun ohjelman tuloste.


Toisella rivillä käytetään muuttujaa. Muuttujien edessä on dollarimerkki ($), ja niitä voidaan tunkea vaikka merkkijonojen (jotka erotetaan lainausmerkillä) sisälle. Muuttujia käsitellään tarkemmin myöhemmin. Esimerkissä käyttämämme muuttuja <tt>$PWD</tt> on [[ympäristömuuttuja]], jonka arvona on aina se hakemisto, jossa käyttäjä on. Voit kokeilla tätä esimerkiksi kirjoittamalla komentoriville komennon <tt>echo $PWD</tt>.
* Versiossa 2.0 lisättiin mahdollisuus synkronoida paketteja (--sync valitsemilla) pääpalvelimen kanssa pakettitietokantojen kautta. Tätä aiemmin paketit piti manuaalisesti asentaa käyttämällä --add ja -upgrade toimintoja.


Viimeisellä rivillä ajetaan normaalisti komentoriviohjelma [[ls]]. Voit myös kokeilla korvata tämän rivin rivillä
* Versiossa 3.0 siirryttiin kaksiosaiseen <tt>pacman</tt>iin — taustaprosessiin nimeltä ''libalpm'' (Arch Linux paketinhallintakirjasto) ja tutumpaan ''<tt>pacman</tt>''-käyttöliittymään. Nopeus parantui monissa tapauksissa, samalla kun riippuvuus ja ristiriitojen ratkaiseminen pystyi käsittelemään yhä suuremman määrän tapauksia. Siirros kirjastopohjaiseen ohjelmaan helpottaisi tulevaisuudessa vaihtoehtoisten käyttöliittymien kehittämistä.
<syntaxhighlight lang="bash">
echo "`ls`"
</syntaxhighlight>


Merkintä $() voidaan kirjoittaa myös ``, kuten alla esimerkissä. Tällöin kuitenkaan ei voi käyttää sisäkkäisiä komentoja.
* Versiossa 4.0 lisättiin paketin allekirjoitus ja varmennus mahdollisuudet koko makepgk/repo-add/<tt>pacman</tt>-työkaluketjuun GnuPGn ja GPGME:n avulla.


Skripti voitaisiin myös kirjoittaa suoraan komentoriville muodossa
* Versio 5.0 toi tuen tapahtumia edeltäville sekä niiden jälkeisille koukuille ja tietokantatiedostoluettelon toimintojen synkronisoinnille.
<syntaxhighlight lang="bash">
echo "Hei, `whoami`, mitä kuuluu"; echo "Olet hakemistossa $PWD, tiedostolistaus:"; ls;
</syntaxhighlight>


== Muuttujat ==
== Käyttö ==
Muuttujat määritellään syntaksilla
===Päivittäminen===
<syntaxhighlight lang="bash">
Päivitetään koko järjestelmä (valitsin <tt>-u</tt>) pakettitietokanta samalla kertaa synkronoiden:
nimi=arvo
# <tt>pacman</tt> -Syu
</syntaxhighlight>
ja niihin viitataan laittamalla muuttujan eteen $
<syntaxhighlight lang="bash">
$nimi
</syntaxhighlight>
Siinä tapauksessa mikäli halutaan, että komennon tulos on muuttuja asetetaan muuttuja tyyliin:
<syntaxhighlight lang="bash">
nimi=("komennon nimi ja parametrit")
</syntaxhighlight>
Tapauksia, joissa käyttäjän tarkoittama muuttuja on epäselvä, tulee käyttää aaltosulkuja muuttujan ympärillä
<syntaxhighlight lang="bash">
${foo}bar
</syntaxhighlight>
kun halutaan tulostaa teksti <tt>bar</tt> muuttujan <tt>foo</tt> jälkeen.


Ensimmäisen skriptimme tapauksessa käytimme jo ympäristömuuttujaa $PWD echo:n kanssa. Tehdäänpä samantyyppinen skripti nyt käyttäen itse määrittelemäämme muuttujaa:
Päivitetään/asennetaan ennestään olemassaoleva, esimerkiksi vanhempi versio sovelluksesta tai itsetehty ohjelmapaketti:
<syntaxhighlight lang="bash">
# <tt>pacman</tt> -U foobar-0.1.4-2.pkg.tar.gz
#!/bin/bash
HEI="Hei, `whoami`, mitä kuuluu?"
echo $HEI
</syntaxhighlight>
Kuten huomaat, kun muuttujaan sijoitetaan arvo, voidaan käyttää samoja "kikkoja" kuin muuallakin skriptissä, esimerkiksi tässä tapauksessa sijoitamme muuttujaan merkkijonon jonka sisällä on ohjelman <tt>whoami</tt> tuloste.


Huomaa, että yhtäsuuruusmerkin on oltava kiinni muuttujan nimessä ja arvossa, eli seuraavat muodot eivät käy:
===Asentaminen===
MUUTTUJA = "terve vaan"
Paketit asennetaan valitsemalla <tt>-s</tt> .
MUUTTUJA= "moi"
Asennetaan paketti {{Pkg|zsh}}:
  MUUTTUJA ="moi"
  # <tt>pacman</tt> -S {{Pkg|zsh}}


Lisäksi muuttujaan sijoitettavan arvon on oltava lainausmerkkien sisällä, jos siihen kuuluu välilyönti. Yksittäisen sanan tai numeron voi sijoittaa ilman lainausmerkkejä:
Näytetään paketin {{Pkg|nginx}} ja sen riippuvaisuuksien suorat osoitteet. Tällöin käyttäjä voi kopioida paketit käsin vaikkapa hakemistoon <tt>/var/cache/pacman/pkg/</tt> ja käyttää tämän jälkeen normaalia <tt>pacman</tt>-syntaksia niiden asentamiseen.
<syntaxhighlight lang="bash">
$ <tt>pacman</tt> -Sp {{Pkg|nginx}}
numero=43
</syntaxhighlight>


== Ehtolauseet ==
===Etsiminen===
Ehdollisia rakenteita luodaan bashille if, then, else ja fi -avainsanoilla. Rakenteen syntaksi on seuraava:
Etsitään hakusanan "chess" sisältävät paketit pakettitietokannasta:
<syntaxhighlight lang="bash">
$ <tt>pacman</tt> -Ss chess
if [ ehto ]
then
    lauseita
elif [ toinen ehto ]
then
    lauseita
else
    muita lauseita
fi
</syntaxhighlight>


Ehdot merkitään hakasulkeiden sisään esimerkiksi seuraavalla tavalla
Etsitään kaikki koneelle asennetut paketit, jotka sisältävät hakusanan "alsa":
<syntaxhighlight lang="bash">
$ <tt>pacman</tt> -Qs alsa
#!/bin/bash
if [ $PWD = "/" ]
then
    echo "Tämä skripti suoritetaan juurihakemistossa";
else
    echo "Skripti suoritetaan hakemistossa $PWD";
fi
</syntaxhighlight>


=== Yhden rivin ehtolauseet ===
===Tietojen näyttäminen===
Lyhyiden skriptien kanssa.
Näytetään asentamattoman (pakettitietokannasta löytyvän) paketin {{Pkg|termite}} tiedot:
<syntaxhighlight lang="bash">
$ <tt>pacman</tt> -Si {{Pkg|termite}}
[ ehto ] && lauseita || [ toinen ehto ] && lauseita || muita lauseita


[ $PWD = "/" ] && printf "Tämä skripti suoritetaan juurihakemistossa\n" || printf "Skripti suoritetaan hakemistossa %s\n" "$PWD"
Näytetään koneelle asennetun paketin {{Pkg|byobu}} tiedot:
</syntaxhighlight>
$ <tt>pacman</tt> -Qi {{Pkg|byobu}}


Tässä käytetään vertailuoperaattoria =, joka on tosi, jos merkkijonot ovat samat. Muita vertailuoperaattoreita ovat
Näytetään mihin pakettiin tiedosto /usr/bin/ag kuuluu:
{|<!--taulukon määrite--> {{siistitaulukko}}
$ <tt>pacman</tt> -Qo /usr/bin/ag
|-
! Operaattori
! Kuvaus
|-
<!-- taulukko alkaa tästä -->
| !  || Negaatio-operaattori, "Onko seuraava ehto epätosi?"
|-
| -n || Pituus ei ole 0
|-  
| -z || Pituus on 0
|-
| -d || Hakemisto on olemassa
|-
| -f || Tavallinen tiedosto on olemassa
|-
| -r || Onko tiedostoon lukuoikeus
|-
| -w || Onko tiedostoon kirjoitusoikeus
|-
| -x || Onko tiedostoon ajo-oikeus
|-
| -eq || Kokonaisluvut ovat yhtäsuuret (a = b)
|-
| -ne || Kokonaisluvut eivät ole yhtä suuret (a != b)
|-
| = || Merkkijonot ovat samat (myös ==)
|-
| != || Merkkijonot eivät ole samat
|-
| -lt || Kokonaisluku on pienempi kuin toinen
|-
| -gt || Kokonaisluku on suurempi kuin toinen (a > b)
|-
| -le || Kokonaisluku on pienempi tai yhtäsuuri kuin toinen (a <= b)
|-
| -ge || Kokonaisluku on suurempi tai yhtäsuuri kuin toinen (a >= b)
|}


Esimerkiksi seuraavat ehdot ovat tosia
===Poistaminen===
<syntaxhighlight lang="bash">
Poistetaan paketti {{Pkg|cmus}}:
[ 2 -lt 5 ]
# <tt>pacman</tt> -R {{Pkg|cmus}}
[ "moi" != "linux" ]
[ 54 -ge 53 ]
[ -f "/etc/fstab" ]
</syntaxhighlight>


== Silmukat ==
Poistetaan vain ja ainoastaan paketti {{Pkg|xorg-server}}.
=== For ===
# <tt>pacman</tt> -Rdd {{Pkg|xorg-server}}
For-silmukka on näppärä monessa tapauksessa, tässä esimerkkinä hakemiston kaikkien tiedostojen läpikäynti.
{{Huomautus|Tällöin ei tule huomautusta poistaa muita paketteja ja riippuvuuksia, jotka mahdollisesti ovat riippuvaisia poistetusta paketista, joka voi johtaa sovelluksien tai jopa järjestelmän rikkoutumiseen ellei poistettua pakettia, joko uudelleenasenneta tai sen riippuvuuksia poisteta. Useimmiten tämä komento tulee tarpeeseen asennettaessa vastaavaa pakettia, jolloin poistettava paketin poisto normaalisti voisi johtaa myös riippuvuuksien ja kyseisestä paketista riippuvaisten toisten pakettien poistamiseen. On siis vain nopeampaa poistaa vain ja ainoastaan ongelmallinen paketti.}}


<syntaxhighlight lang="bash">
Poistetaan paketti {{Pkg|cantata}} riippuvuuksineen päivineen.
for muuttuja in `ls`
# <tt>pacman</tt> -Rns {{Pkg|cantata}}
do
    echo $muuttuja
done
</syntaxhighlight>
Silmukassa suoritettavat rivit laitetaan siis sanojen <tt>do</tt> ja <tt>done</tt> väliin. Laskurimuuttujaan sijoitetaan vuorotellen <tt>in</tt>:n jälkeen olevat sanat, esimerkiksi tässä tapauksessa komennon [[ls]] tuloste (eli hakemistossa olevien tiedostojen nimet). Ohjelman tuloste voidaan merkitä myös seuraavasti: <tt>$(komento)</tt>. Jos silmukalla on käytävä läpi kaikki kokonaisluvut tietyltä väliltä, voi käyttää komentoa [[seq]], joka tulostaa kokonaisluvut väliltä 1-annettu parametri. Esimerkiksi
<syntaxhighlight lang="bash">
echo "Lasketaan kymmeneen:"
for luku in $(seq 10)
do
    echo $luku
done
</syntaxhighlight>


Läpi käytävä joukko voidaan merkitä myös syntaksilla <tt>{alku..loppu}</tt>. Jos esimerkiksi halutaan käydä läpi kaikki merkit c-o, kokeile vaikka kirjoittaa
Poistetaan paketti {{Pkg|cmus}} ja sen riippuvuudet, joita ei tarvita:
<syntaxhighlight lang="bash">for muuttuja in {c..o}; { echo -n "$muuttuja "; sleep 1;}</syntaxhighlight>
# <tt>pacman</tt> -Rs {{Pkg|cmus}}


=== While ===
==Pakettien aiheuttama tallennustilan täyttyminen ja sen puhdistaminen==
While suorittaa lausekkeita niin kauan kuin ehto on tosi. Kun ehto on epätosi poistutaan loopista jolloin skriptin suoritus jatkuu seuraavalta loogiselta riviltä (while-lausekkeen jälkeiseltä riviltä).
<syntaxhighlight lang="bash">
while [ ehto ]
do
    lauseita
done


Esimerkki:
Poistetaan kaikki <tt>pacman</tt>in lataamat paketit hakemistosta <tt>/var/cache/pacman/pkg</tt>. Mikäli valitsin annetaan muodossa -Sc, poistetaan vain vain vanhentuneet paketit. Mikäli paketteja ei poisteta tarpeeksi usein, kertyy niitä helposti useiden gigatavujen verran ja voi pahimmillaan täyttää <code>/var</code>-osion, oli sitten erillinen oma osionsa tai osa <code>/</code>juuri-osiota, joka johtaa siihen, että uusien päivitysten asentaminen ei onnistu ennen kuin ylimääräiset paketit poistetaan.
while [ -f "testi" ]
# <tt>pacman</tt> -Scc
do
    echo "Tiedosto on olemassa."
    sleep 1
done
</syntaxhighlight>
Edellä oleva skripti tarkistaa, onko samassa hakemistossa oleva tiedosto <tt>testi</tt> olemassa. Tätä jatketaan niin kauan kunnes tiedostoa ei enää ole.


=== Until ===
[[Arch User Repository|AUR]]-sovellus {{AUR|pacleaner}} avulla on tosin mahdollista siivota <tt>pacman</tt> välimuistia niin, että kaikki muu, tarpeettomat paketit mukaanlukien poistetaan paitsi viimeksi ladatut, jolloin palaaminen aiempiin versioihin on mahdollista, mikäli viimeisimmät versiot omaavat esimerkiksi ohjelmavirheitä.
Until on while:n vastakohta. Until-lauseke jatkaa suoritusta niin kauan kunnes ehto on tosi.
<syntaxhighlight lang="bash">
until [ ehto ]
do
    lauseita
done
</syntaxhighlight>


== Funktiot ==
$ pacleaner -um --delete
Kuten "oikeissa" ohjelmointikielissä, myös bash-skripteissä on mahdollista käyttää funktioita seuraavalla tavalla


<syntaxhighlight lang="bash">
==Listaa asennetut paketit==
#!/bin/bash
Muokkaamalla käytössä olevan [[komentotulkki|komentotulkin]] asetustiedostoa, voidaan lisätä funktio, joka oletuksena listaa saman päivän aikana asennetut paketit aikajärjestyksessä, valitsin <tt>-a</tt> listaa kaikki asennetut paketit  aikajärjestyksessä, tai pelkän kokonaisluvun lisäämällä lukua vastaavan määrän asennettuja paketteja. Esim. [[bash]]-komentotulkin [[.bashrc]]-tiedostoon:
function Käyttis {
        os="Linux"
}
os="Windows"
#Kutsutaan funktiota
Käyttis
echo $os
</syntaxhighlight>


Tulostaisi "Linux".
''Vaatimukset:'' {{pkg|expac}}


Funktio määritellään siis syntaksilla
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
# pacman päivitys historia
# vaatimukset: expac


function Funktio {
pachis() {
#koodi
  printf "\n"
}
</syntaxhighlight>
Jos halutaan skriptin toimivan myös [[Sh]]-komentotulkkia käytettäessä, funktion kanssa on käytettävä syntaksia
<syntaxhighlight lang="bash">
Funktio() { ... }
</syntaxhighlight>


Jos muuttujia ei funktiossa erikseen määritellä yksityisiksi, ne ovat julkisia. Eli kun esimerkkiskriptissämme muutimme muuttujan $os arvoa funktiossa, tämä muutos näkyi myös funktion ulkopuolella. Muuttuja voidaan määritellä yksityiseksi avainsanalla <tt>local</tt>:
  local vanhin_paivitys=$(expac --timefmt='%Y-%m-%d %T' '%l\t%n' | sort -r | tail -1 | awk '{print $1}');
  local viimeisin_paivitys=$(expac --timefmt='%Y-%m-%d %T' '%l\t%n' | sort -n | tail -1 | awk '{print $1}');


<syntaxhighlight lang="bash">
  case $1 in
#!/bin/bash
      -a)  expac --timefmt='%Y-%m-%d %T' '%l\t%n' | sort -n; printf "\n Vanhin päivittämättä oleva paketti: %s\n\n" $vanhin_paivitys; ;;
function Käyttis {
      -h)  pachis_help; ;;
        local os        # os paikallinen muuttuja
      ''|*[!0-9]*) expac --timefmt='%Y-%m-%d %T' '%l\t%n'| sort -n | grep "$viimeisin_paivitys"; printf "\n Päivitetty viimeksi %s\n\n" $viimeisin_paivitys; ;;
        os="Gentoo"
      ''|*[0-9]*) expac --timefmt='%Y-%m-%d %T' '%l\t%n'| sort -n | tail -n"$1"; printf "\n $1 viimeisintä päivitystä lueteltuna.\n\n"; ;;
      *)  printf "\n pachis\n\n Tulostaa päivitykset aikajärjestyksessä.\n" ;;
  esac
}
}
os="Debian"
#Kutsutaan funktiota
Käyttis
echo $os
</syntaxhighlight>


Tulostaisi "Debian".
pachis_help(){
cat >&2 << EOF


== Vinkkejä ==
  pachis() - pacman historia 2022-02-27
=== Joukot ===
Käytimme jo aiemmin merkintätapaa <tt>{1..4}</tt> merkitsemään joukkoa, johon kuuluu kaikki välin merkit (esimerkissä 1,2,3,4). Tämä ominaisuus on kuitenkin monipuolisempi. Esimerkiksi jos haluamme luoda Matille, Martalle ja Jormalle työ- ja kotihakemistot, voisimme kirjoittaa lyhyesti näin
mkdir {ma{ti,rta},jorma}n_{työ,koti}hakemisto
Jolloin luotaisiin hakemistot matin_työhakemisto, matin_kotihakemisto, martan_työhakemisto, martan_kotihakemisto, jorman_työhakemisto ja jorman_kotihakemisto.


Puretaanpa hieman tuota komentoa. <tt>ma{ti,rta}</tt> tuottaa sanat mati ja marta. Kun joukon merkinnän ulkopuolella on n, liitetään jokaisen joukon sisällä olevan alkion perään n, jolloin alaviivaa edellä oleva osuus tuottaa sanat matin, martan ja jorman. Jälkimmäinen osuus toimii samalla tavalla, sanojen työ ja koti perään liitetään sana hakemisto. Näin saamme lyhyellä komennolla aikaan paljon.
  Oletuksena tulostaa kaikki päivitysten viimeisimmän päivitysten asennuspäivän aikana asennetut päivitykset.


Tärkeä huomio on, että <tt>{}</tt>-joukon tulkitsee bash-komentotulkki eikä ohjelma, jonka yhteydessä <tt>{}</tt>-joukkoa käytetään. Käytännössä tämä tarkoittaa, että ensin bash ikään kuin avaa joukon ja vasta sen jälkeen suorittaa komentorivin. Tässä esimerkissä <tt>mkdir</tt>-ohjelma saa parametreikseen vain listan luotavista hakemistoista eikä <tt>mkdir</tt> edes tiedä, että käytettiin <tt>{}</tt>-joukkoa:
  -h
mkdir matin_työhakemisto matin_kotihakemisto martan_työhakemisto martan_kotihakemisto jorman_työhakemisto jorman_kotihakemisto
    Näyttää tämän viestin.


Tässä huomataan myös, että komentoja voi käyttää aivan normaalien [[Komentorivikomennot|komentoriviohjelmien]] kanssa, sillä bash käsittelee syötteen, ja suorittaa skriptit antaen ohjelmalle syötteenä skriptin tulosteen.
  -a
    Tulostaa kaikki asennetut paketit päivitysjärjestyksessä.
 
  [0-9]+
    Tulostaa määritellyn määrän viimeisempinä asennettuja/päivitettyjä paketteja.


=== Hyödyllisiä ohjelmia ===
EOF
Unixin filosofian mukaisesti Linuxissa on lukuisia ohjelmia, jotka hoitavat jonkin yksittäisen tehtävän ja tekevät sen hyvin. Näitä pikkuohjelmia käytetäänkin usein skripteissä hoitamaan erilaisia tehtäviä.


Kaikista Linux-järjestelmistä löytyviä ohjelmia on listattu luokkaan [[:Luokka:Komentorivin perustyökalut|Komentorivin perustyökalut]]. Näitä ohjelmia kannattaa selailla. Komentoriviohjelmia on listattu käyttötarkoituksen mukaan myös artikkelissa [[komentorivikomennot]].
}
 
Esimerkkinä ladataan kaikki [[LinuCast]]-podcastin [[ogg]]-muotoiset jaksot käyttämällä jokaisesta järjestelmästä löytyviä peruskomentoja [[seq]] ja [[wget]]:
 
(esimerkin sivusto on kuollut ja kuopattu, joten koodi ei toimi)
 
<syntaxhighlight lang="bash">
#!/bin/bash
for  i in `seq -f"%03g" 1 104`
do
    wget -c "http://koskisuomi.pp.fi/linucast/LinuCast$i.ogg"
done
</syntaxhighlight>
 
Esimerkkiohjelma voidaan tallentaa vaikka nimelle <tt>linuxcast.sh</tt> ja sille voidaan antaa [[chmod|suoritusoikeudet]] komennolla
chmod u+rx linucast.sh
Tämän jälkeen komentojono ajettaisiin komennolla
./linucast.sh
 
*1 tarkoittaa että mistä numerosta aloitetaan
*104 tarkoittaa kuinka monta jaksoa haetaan, lukua voi kasvattaa jaksojen lisääntyessä.
 
Esimerkki ohjelmana 2. Ladataan kaikki Full Circle magazinen englanninkieliset pdf-tiedostot palvelimelta. Esimerkissä on käytetty Bash skriptaus koodeja joita löytyy esimerkiksi tältä sivulta.
 
<syntaxhighlight lang="bash">
#!/bin/bash
 
# Tyhjennetään ruutu
clear
 
# Haetaan kaikki Full Circle artikkelit numeroon 1-55 asti.
 
for luku in $(seq 55)
do
  FILE="issue"$luku"_en.pdf"
 
# Tarkistetaan onko tiedosto jo olemassa, ennen kuin ladataan se. 
if [ -f $FILE ]; then
  echo " '$FILE' tiedosto on olemassa."
else
  echo " '$FILE' tiedostoa ei ole olemassa. Ladataan se..."
  wget "https://dl.fullcirclemagazine.org/$FILE"
 
# Pidetään 5 sekunnin tauko latausten välissä, mukana laskuri
 
for (( i=5; i>0; i--)); do
    sleep 1 &
    printf "\b\b$i"   
    wait
done
fi
done
echo "Lataus valmis"
</syntaxhighlight>
</syntaxhighlight>


Esimerkkiohjelma voidaan tallentaa vaikka nimelle <tt>issueLataaja.sh</tt> ja sille voidaan antaa [[chmod|suoritusoikeudet]] komennolla
==Katso myös==
chmod u+rx issueLataaja.sh
* [[Rosetta]], eri jakeluiden paketinhallintaohjelmistojen käskyjen tulkinta ja käyttö.
Tämän jälkeen komentojono ajettaisiin komennolla
./issueLataaja.sh
 
== Katso myös ==
*[[Komentorivin perusteet]]
*[[Komentorivivinkkejä]]
 
==Aiheesta muualla==
*[https://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide] - laaja englanninkielinen opas bash-skriptaukseen
*[https://www.panix.com/~elflord/unix/bash-tute.html Pikaopas bash-skriptaukseen] (englanniksi)
*[https://web.archive.org/web/20170610153335/https://gd.tuwien.ac.at/linuxcommand.org/writing_shell_scripts.php Writing shell scripts] - toinen laaja englanninkielinen opas bash-skriptaukseen - archive.org tallenne 10.6.2017
*[https://www.shellcheck.net/ ShellCheck] on www-ohjelma, joka havaitsee kaikki [[sh]] ja [[bash]]-skriptien ongelmat ja antaa niille parannus ehdotukset.
*[https://explainshell.com/ ExplainShell] on www-ohjelma, joka antaa ohjetekstin annetuille komennoille.
*[https://mywiki.wooledge.org/BashPitfalls Bash Pitfalls] yleisimmät bash-skriptauksen sudenkuopat.
 


[[Luokka:Paketinhallinta]]
[[Luokka:Komentorivin erikoisohjelmat]]


[[Luokka:Komentorivi]]
[[pl:pacman]]
[[Luokka:Ohjeet]]

Nykyinen versio 22. marraskuuta 2022 kello 09.15

pacman
Käyttöliittymä teksti
Lisenssi GPLv2+
Kotisivu archlinux.org/pacman
Lähdekoodi git.archlinux.org/pacman.git

pacman on Arch Linuxin sekä siihen pohjautuvien jakeluiden kuten Manjaron ja Parabola GNU/Linux-libren kuten myös Slackware:n sukulaisjakelu Frugalwaren käyttämä paketinhallintaohjelma, jolla hallitaan järjestelmään asennettuja ohjelmapaketteja. Siinä on tuki riippuvuuksien hallintaan sekä kyky ottaa yhteys etäpalvelimeen ja automaattisesti päivittää, asentaa tai poistaa paketteja. Myös paikallisten pakettien asentaminen on mahdollista. Koska valitsimet ovat yhden kirjaimen mittaisia, pacmanilla on verrattaen nopea kirjoittaa, jopa monimutkaisia komentoja verrattuna esimerkiksi Debian-pohjaisten jakeluiden käyttämin Apt-paketinhallintaohjelmiin.

Arch Linuxin paketit ovat gzipattuja tarballeja ja Frugalwaren paketit bzip2-pakattuja tarballeja. Tiedostopäätteenä Arch Linuxin paketeissa on .pkg.tar.gz ja Frugalwaren paketeissa .fpm. pacmanin asetustiedosto on /etc/pacman.conf.

Frugalware on nykyisin siirtynyt käyttämään alkuperäisen Arch Linuxin pacmanin sijaan uudelleenkirjoitettua pacman-versiota nimeltä pacman-G2. pacman-G2 on syntaksiltaan käytännössä samanlainen kuin alkuperäinen pacman [1].

Historia[muokkaa]

  • Versiossa 2.0 lisättiin mahdollisuus synkronoida paketteja (--sync valitsemilla) pääpalvelimen kanssa pakettitietokantojen kautta. Tätä aiemmin paketit piti manuaalisesti asentaa käyttämällä --add ja -upgrade toimintoja.
  • Versiossa 3.0 siirryttiin kaksiosaiseen pacmaniin — taustaprosessiin nimeltä libalpm (Arch Linux paketinhallintakirjasto) ja tutumpaan pacman-käyttöliittymään. Nopeus parantui monissa tapauksissa, samalla kun riippuvuus ja ristiriitojen ratkaiseminen pystyi käsittelemään yhä suuremman määrän tapauksia. Siirros kirjastopohjaiseen ohjelmaan helpottaisi tulevaisuudessa vaihtoehtoisten käyttöliittymien kehittämistä.
  • Versiossa 4.0 lisättiin paketin allekirjoitus ja varmennus mahdollisuudet koko makepgk/repo-add/pacman-työkaluketjuun GnuPGn ja GPGME:n avulla.
  • Versio 5.0 toi tuen tapahtumia edeltäville sekä niiden jälkeisille koukuille ja tietokantatiedostoluettelon toimintojen synkronisoinnille.

Käyttö[muokkaa]

Päivittäminen[muokkaa]

Päivitetään koko järjestelmä (valitsin -u) pakettitietokanta samalla kertaa synkronoiden:

# pacman -Syu

Päivitetään/asennetaan ennestään olemassaoleva, esimerkiksi vanhempi versio sovelluksesta tai itsetehty ohjelmapaketti:

# pacman -U foobar-0.1.4-2.pkg.tar.gz

Asentaminen[muokkaa]

Paketit asennetaan valitsemalla -s . Asennetaan paketti zsh :

# pacman -S zsh

Näytetään paketin nginx ja sen riippuvaisuuksien suorat osoitteet. Tällöin käyttäjä voi kopioida paketit käsin vaikkapa hakemistoon /var/cache/pacman/pkg/ ja käyttää tämän jälkeen normaalia pacman-syntaksia niiden asentamiseen.

$ pacman -Sp nginx

Etsiminen[muokkaa]

Etsitään hakusanan "chess" sisältävät paketit pakettitietokannasta:

$ pacman -Ss chess

Etsitään kaikki koneelle asennetut paketit, jotka sisältävät hakusanan "alsa":

$ pacman -Qs alsa

Tietojen näyttäminen[muokkaa]

Näytetään asentamattoman (pakettitietokannasta löytyvän) paketin termite tiedot:

$ pacman -Si termite

Näytetään koneelle asennetun paketin byobu tiedot:

$ pacman -Qi byobu

Näytetään mihin pakettiin tiedosto /usr/bin/ag kuuluu:

$ pacman -Qo /usr/bin/ag

Poistaminen[muokkaa]

Poistetaan paketti cmus :

# pacman -R cmus

Poistetaan vain ja ainoastaan paketti xorg-server .

# pacman -Rdd xorg-server

Huomautus: Tällöin ei tule huomautusta poistaa muita paketteja ja riippuvuuksia, jotka mahdollisesti ovat riippuvaisia poistetusta paketista, joka voi johtaa sovelluksien tai jopa järjestelmän rikkoutumiseen ellei poistettua pakettia, joko uudelleenasenneta tai sen riippuvuuksia poisteta. Useimmiten tämä komento tulee tarpeeseen asennettaessa vastaavaa pakettia, jolloin poistettava paketin poisto normaalisti voisi johtaa myös riippuvuuksien ja kyseisestä paketista riippuvaisten toisten pakettien poistamiseen. On siis vain nopeampaa poistaa vain ja ainoastaan ongelmallinen paketti.


Poistetaan paketti cantata riippuvuuksineen päivineen.

# pacman -Rns cantata

Poistetaan paketti cmus ja sen riippuvuudet, joita ei tarvita:

# pacman -Rs cmus

Pakettien aiheuttama tallennustilan täyttyminen ja sen puhdistaminen[muokkaa]

Poistetaan kaikki pacmanin lataamat paketit hakemistosta /var/cache/pacman/pkg. Mikäli valitsin annetaan muodossa -Sc, poistetaan vain vain vanhentuneet paketit. Mikäli paketteja ei poisteta tarpeeksi usein, kertyy niitä helposti useiden gigatavujen verran ja voi pahimmillaan täyttää /var-osion, oli sitten erillinen oma osionsa tai osa /juuri-osiota, joka johtaa siihen, että uusien päivitysten asentaminen ei onnistu ennen kuin ylimääräiset paketit poistetaan.

# pacman -Scc

AUR-sovellus pacleanerAUR avulla on tosin mahdollista siivota pacman välimuistia niin, että kaikki muu, tarpeettomat paketit mukaanlukien poistetaan paitsi viimeksi ladatut, jolloin palaaminen aiempiin versioihin on mahdollista, mikäli viimeisimmät versiot omaavat esimerkiksi ohjelmavirheitä.

$ pacleaner -um --delete

Listaa asennetut paketit[muokkaa]

Muokkaamalla käytössä olevan komentotulkin asetustiedostoa, voidaan lisätä funktio, joka oletuksena listaa saman päivän aikana asennetut paketit aikajärjestyksessä, valitsin -a listaa kaikki asennetut paketit aikajärjestyksessä, tai pelkän kokonaisluvun lisäämällä lukua vastaavan määrän asennettuja paketteja. Esim. bash-komentotulkin .bashrc-tiedostoon:

Vaatimukset: expac

# pacman päivitys historia
# vaatimukset: expac

pachis() {
  printf "\n"

  local vanhin_paivitys=$(expac --timefmt='%Y-%m-%d %T' '%l\t%n' | sort -r | tail -1 | awk '{print $1}');
  local viimeisin_paivitys=$(expac --timefmt='%Y-%m-%d %T' '%l\t%n' | sort -n | tail -1 | awk '{print $1}');

  case $1 in
      -a)  expac --timefmt='%Y-%m-%d %T' '%l\t%n' | sort -n; printf "\n Vanhin päivittämättä oleva paketti: %s\n\n" $vanhin_paivitys; ;;
      -h)  pachis_help; ;;
      ''|*[!0-9]*) expac --timefmt='%Y-%m-%d %T' '%l\t%n'| sort -n | grep "$viimeisin_paivitys"; printf "\n Päivitetty viimeksi %s\n\n" $viimeisin_paivitys; ;;
      ''|*[0-9]*) expac --timefmt='%Y-%m-%d %T' '%l\t%n'| sort -n | tail -n"$1"; printf "\n $1 viimeisintä päivitystä lueteltuna.\n\n"; ;;
      *)  printf "\n pachis\n\n Tulostaa päivitykset aikajärjestyksessä.\n" ;;
  esac 
}

pachis_help(){
cat >&2 << EOF 

  pachis() - pacman historia 2022-02-27

  Oletuksena tulostaa kaikki päivitysten viimeisimmän päivitysten asennuspäivän aikana asennetut päivitykset.

  -h
     Näyttää tämän viestin.

  -a 
    Tulostaa kaikki asennetut paketit päivitysjärjestyksessä.
  
  [0-9]+
    Tulostaa määritellyn määrän viimeisempinä asennettuja/päivitettyjä paketteja.

EOF

}

Katso myös[muokkaa]

  • Rosetta, eri jakeluiden paketinhallintaohjelmistojen käskyjen tulkinta ja käyttö.