20. fejezet - Bash és Bash parancsfájlok

Tartalomjegyzék

20.1. Mi az a parancsértelmező?
20.2. Parancsfájlok írása
20.3. Parancsesemények átirányítása
20.4. Álnevek használata
20.5. Változók használata a Bash parancsértelmezőben
20.6. Parancsok csoportosítása és kombinálása
20.7. Futásvezérlők használata
20.8. További információk

Kivonat

Manapság sok ember használ számítógépet valamilyen (például GNOME vagy KDE) grafikus felülettel. Bár ezek számtalan funkciót kínálnak, automatikus feladatok végrehajtásához használatuk korlátozott. A parancsértelmezők remek kiegészítői a grafikus felületnek és ez a fejezet áttekintést nyújt a parancsértelmezők, jelen esetben a Bash vonatkozásában.

20.1. Mi az a parancsértelmező?

Hagyományosan a parancsértelmező a Bash (Bourne again Shell). Amikor a fejezetben a parancsértelmező kerül említésre, akkor ez a Bash parancsértelmezőt jelenti. A Bash parancsértelmező mellett több parancsértelmező is elérhető (ash, csh, ksh, zsh, …), mindegyik különböző funkcióval és karakterisztikával rendelkezik. Amennyiben további információra van szüksége a többi parancsértelmezővel kapcsolatban, keressen rá a shell kifejezésre a YaST szoftverkezelő moduljában.

20.1.1. A Bash konfigurációs fájlok ismerete

A parancsértelmező az alábbi módokon hívható meg:

  1. Interaktív bejelentkezési parancsértelmező. Ennek használata akkor történik, ha a Bash a --login paraméterrel indul vagy egy távoli gépre jelentkezik be SSH-n keresztül.

  2. Szokásos interaktív parancsértelmező. Ennek használata az xterm, konsole, gnome-terminal vagy hasonló eszközök indításakor történik.

  3. Nem interaktív parancsértelmező. Ez akkor kerül felhasználásra, ha a parancsértelmező parancssorból indul.

Attól függően, hogy milyen típusú parancsértelmezőt használ, különböző konfigurációs fájlok kerülnek beolvasásra. Az alábbi táblázat a bejelentkező és nem-bejelentkező parancsértelmező konfigurációs fájljait mutatja.

20.1. táblázat - Bash konfigurációs fájlok a bejelentkező parancsértelemzőhöz

Fájl

Leírás

/etc/profile

Ne módosítsa ezt a fájlt, mert a következő frissítéskor a módosítások elveszhetnek.

/etc/profile.local

Használja ezt a fájlt az /etc/profile kiterjesztéséhez

/etc/profile.d/

Rendszerszintű konfigurációs fájlok különböző programokhoz

~/.profile

Itt lehet felhasználó specifikus beállításokat megadni


20.2. táblázat - Bash konfigurációs fájlok a nem bejelentkező parancsértelmezőkhöz

/etc/bash.bashrc

Ne módosítsa ezt a fájlt, mert a következő frissítéskor a módosítások elveszhetnek.

/etc/bash.bashrc.local

Használja ezt a fájlt a Bash rendszerszintű módosításainak beállításához.

~/bashrc

Itt adja meg a felhasználóspecifikus módosításokat.


Ezen túlmenően a Bash használ még néhány fájlt:

20.3. táblázat - Különleges fájlok a Bash parancsértelmezőhöz

Fájl

Leírás

~/.bash_history

A begépelt parancsok listáját tartalmazza

~/.bash_logout

Kilépéskor kerül lefuttatásra


20.1.2. Könyvtárstruktúra

A következő táblázat egy rövid áttekintést nyújt a Linux rendszereken található legfontosabb könyvtárakról. További részletes információ a könyvtárakról és az alkönyvtárakról a táblázatot követő listában található.

20.4. táblázat - Egy szokásos könyvtárfa áttekintése

Könyvtár

tartalom

/

gyökérkönyvtár, a könyvtárfa kiindulópontja.

/bin

Alapvető bináris fájlok, mint például a parancsok, amelyekre mind a rendszer-adminisztrátoroknak, mind a felhasználóknak szükségük van. Általában tartalmazzák a parancsértelmezőket, mint például a Bash-t.

/boot

A rendszertöltő statikus fájljai.

/dev

Fájlok, amelyekre a gépspecifikus eszközöknek van szüksége.

/etc

Gépspecifikus konfigurációs fájlok.

/home

A rendszeren található felhasználók saját könyvtárai. A root felhasználó saját könyvtára nem a /home, hanem a /root könyvtárban található.

/lib

Alapvető osztott programkönyvtárak és kernelmodulok.

/media

Csatolási pontok a cserélhető adathordozókhoz.

/mnt

Csatolási pontok az átmenetileg felcsatolt fájlrendszerekhez.

/opt

Kiegészítő alkalmazások csomagjai.

/root

A root felhasználó saját könyvtára.

/sbin

Alapvető bináris rendszerfájlok.

/srv

Adatok a rendszer által biztosított szolgáltatásokhoz.

/tmp

Ideiglenes fájlok.

/usr

/var

Változó adatok, például naplófájlok.

/windows

Az alkönyvtár csak akkor jelenik meg, ha a Linux mellett a Microsoft Windows is telepítve van rendszerén. Windows partíció adatait tartalmazza.


A következő lista részletesebb információval és példákkal szolgál arról, hogy milyen fájlok és alkönyvtárak találhatók a fájlrendszerben:

/bin

Tartalmazza azokat a parancsokat, amelyeket a root és a többi felhasználónak is használnia kell. Ilyen parancsok a következők: ls, mkdir, cp, mv, rm és rmdir. A /bin tartalmazza a Bash-t is, amely az openSUSE alapértelmezett parancsértelmezője.

/boot

Tartalmazza a rendszerindításhoz szükséges adatokat, mint a rendszertöltőt, a kernelt és olyan adatokat, amelyekre akkor van szükség, mielőtt a kernel felhasználó módú programokat kezdene futtatni.

/dev

Olyan eszközfájlokat tartalmaz, amelyek a hardverkomponenseket reprezentálják.

/etc

Tartalmazza a helyi konfigurációs fájlokat, amelyek olyan programok beállításait tartalmazzák, mint amilyen az X Window System. Az /etc/init.d alkönyvtár tartalmazza azokat a parancsfájlokat, amelyek a rendszerindítás során kerülnek végrehajtásra.

/home/felhasználónév

tartalmazza azon felhasználók magánjellegű adatait, akik fiókkal rendelkeznek a rendszerben. Az itt található fájlokat csak azok tulajdonosa vagy a rendszergazda módosíthatja. Alapértelmezés szerint, az e-mail könyvtár és az asztali környezet személyes beállításait tartalmazza rejtett fájlokban és könyvtárakban. Saját beállításaikat a A KDE-felhasználók a .kde4, a GNOME-felhasználók pedig a .gconf könyvtárban találhatják. A rejtett könyvtárakkal kapcsolatos további információ a Section “Key Features” (Chapter 6, Basic Concepts, ↑Start-Up) fejezetben található.

[Note]Saját könyvtár (home) egy hálózati környezetben

Hálózati környezetben a saját könyvtár esetleg nem a /home könyvtárban található.

/lib

Tartalmazza az alapvető osztott programkönyvtárakat, amelyek a rendszer betöltéséhez és a parancsok futtatásához szükségesek a root fájlrendszeren. A Windows rendszereken ezek az osztott programkönyvtárak a DLL-fájlok.

/media

Csatolási pontokat tartalmaz az olyan cserélhető adathordozókhoz, mint amilyenek a CD-ROM-ok, pendrive-ok, digitális kamerák (ha USB-t használnak). A /media könyvtár alatt általánosságban bármelyik meghajtó megjelenhet a merevlemez kivételével. A cserélhető adathordozó behelyezése vagy csatlakoztatása után, ha fel van csatolva, akkor itt érhető el egy beszédes nevű alkönyvtárban.

/mnt

Ez a könyvtár tartalmazza az ideiglenesen felcsatolt fájlrendszerek csatolási pontjait. A root felhasználó általában ide csatolja fel a fájlrendszereket.

/opt

Más gyártók szoftvereinek telepítésére fenntartott hely. További programok és nagyobb kiegészítő programcsomagok találhatók itt.

/root

Saját könyvtár a root felhasználó számára. A root felhasználó személyes adatai találhatók itt.

/sbin

Amint azt az s is jelzi, itt a root felhasználó (superuser) segédprogramjai találhatók. Az /sbin tartalmazza a rendszerindításhoz, visszatöltéshez és szükség esetén a /bin helyreállításhoz szükséges bináris állományokat.

/srv

A rendszer által biztosított szolgáltatásokhoz – mint amilyen az FTP vagy a HTTP –, tartozó adatokat tartalmazza.

/tmp

Ezt a könyvtárat olyan programok használják, amelyeknek szüksége van átmeneti fájltárolásra.

[Important]A /tmp könyvtár kiürítése rendszerindításkor

A /tmp könyvtárban található fájlok nem biztos, hogy megmaradnak a rendszer újraindítását követően. Ez például függ a /etc/sysconfig/cron beállításaitól.

/usr

A /usr könyvtárnak semmi köze a felhasználókhoz, mert a UNIX system resources rövidítése. A /usr könyvtárban található adatok statikus, csak olvasható adatok, amelyek megoszthatók olyan rendszerek között, amelyek követik a Filesystem Hierarchy Standard (FHS) szabványt. Ez a könyvtár tartalmazza az összes alkalmazást és egy másodlagos hierarchiát hoz létre a fájlrendszerben. Itt található a KDE4 és a GNOME. A /usr könyvtár számos alkönyvtárat tartalmaz: /usr/bin, /usr/sbin, /usr/local és /usr/share/doc.

/usr/bin

Általánosan elérhető programokat tartalmaz.

/usr/sbin

Azokat a démonokat és programokat tartalmazza, amelyek nem feltétlenül szükségesek a rendszer indulásához.

/usr/local

A rendszergazda ebbe a könyvtárba telepíthet helyi, disztribúciófüggetlen kiterjesztéseket.

/usr/share/doc

Különböző, a rendszerrel kapcsolatos dokumentációkat és kiadási megjegyzéseket tartalmaz. A manual alkönyvtárban található ennek a könyvnek az online változata. Ha egynél több nyelv van telepítve, akkor esetleg a dokumentáció itt különböző nyelveken is elérhető itt.

A packages könyvtárban találhatók azok a dokumentumok, amelyek a rendszeren telepített szoftvercsomagok részei. Minden csomaghoz egy alkönyvtár jön létre /usr/share/doc/packages/csomagnév, amely gyakran tartalmazza a README fájlokat és néha példaprogramokat, konfigurációs fájlokat és további parancsfájlokat.

Ha a howto csomag telepítve van a rendszeren, akkor az /usr/share/doc alatt található egy howto alkönyvtár is, ahol további dokumentumok találhatók a Linux-szoftverek telepítésének és üzemeltetésének számos feladatáról.

/var

Mivel a /usr csak olvasható, statikus adatokat tartalmaz, így a /var tartalmazza a működés során kiírt adatokat, mint például a napló fájlok vagy feldolgozásra váró adatok. A /var/log/ könyvtár alatt található legfontosabb naplófájlokról a következő helyen található áttekintés: Table “Log Files” (↑Start-Up).

/windows

A /windows alkönyvtár csak akkor jelenik meg, ha a Linux mellett Microsoft Windows is telepítve van rendszerén. A számítógépen található Windows partíció adatait tartalmazza. A Windows által használt fájlrendszertől függően akár szerkeszteni is lehet az itt található adatokat. Ha a Windows FAT32 fájlrendszert használ, akkor a rajta található fájlok megnyithatók és szerkeszthetők. Az NTFS fájlrendszer az openSUSE rendszeren szintén írható. Azonban az NTFS-3g fájlrendszer illesztőprogramja korlátozott funkcionalitással bír. Erről további információ a 34.4. - Fájlok elérése különböző operációs rendszereken, ugyanazon a gépen fejezetben található.

20.2. Parancsfájlok írása

A parancsfájlok segítségével bizonyos feladatok kényelmesen elvégezhetők: adatgyűjtés, szó- vagy kifejezéskeresés szövegfájlokban stb. Az alábbi példában egy rövid parancsfájl egy szöveget jelenít meg:

20.1. példa - Parancsfájl szöveg megjelenítésére

#!/bin/sh 1
# Output the following line: 2
echo "Hello World" 3

1

Az első sor az úgynevezett Shebang karakterekkel (#!) kezdődik, amely azt jelzi, hogy ez a fájl egy parancsfájl. A parancsfájlt a Shebang után meghatározott fordító hajtja végre, ebben az esetben a /bin/sh.

2

A második sor egy megjegyzés, amely hash (kettős kereszt #) jellel kezdődik. Ajánlott a bonyolult sorokat megjegyzésekkel történő ellátása, amelyek emlékeztetnek rá, hogy mit is csinálnak.

3

A harmadik sor az echo beépített parancsot tartalmazza, amely megjeleníti a megadott szöveget.


A parancs futtatásának néhány előfeltétele van:

  1. Minden parancsfájlnak tartalmaznia kell Shebang sort (ebben a példában ez szerepel). Ellenkező esetben a fordítót kézzel kell meghívni.

  2. A parancsfájl bármilyen módon elmenthető. Azonban célszerű egy olyan könyvtárba elmenteni, ahol azt a parancsértelmező megtalálja. A keresési útvonal a parancsértelmezőben a PATH környezeti változón keresztül kerül meghatározásra. Általában egy felhasználónak nincs írási joga az /usr/bin könyvtárhoz. Ezert javasolt a parancsfájlokat a felhasználók ~/bin/ könyvtárába menteni. A fenti példa neve hello.sh legyen.

  3. A parancsfájlnak futási jogra van szüksége. A jog beállítása az alábbi paranccsal lehetséges:

    chmod +x ~/bin/hello.sh

Ha minden fenti előfeltétel teljesül, akkor a parancs a következő módokon futtatható:

  1. Abszolút útvonalként.  Ez a parancsfájl abszolút útvonalként futtatható. Ebben az esetben ez ~/bin/hello.sh.

  2. Bárhonnan.  Amennyiben a PATH környezeti változó olyan könyvtárat is tartalmaz, ahol a parancsfájl található, akkor a parancsfájl egyszerűen futtatható a hello.sh parancs begépelésével.

20.3. Parancsesemények átirányítása

Minden parancs három csatornát használhat a bemenethez vagy a kimenethez.

  • Szabványos kimenet.  Ez az alapértelmezett kimeneti csatorna. Amikor egy parancs kinyomtat valamit, akkor a szabványos kimeneti csatornát használja.

  • Szabványos bemenet.  Amennyiben a parancsnak szüksége van a felhasználó részéről valamilyen bemenetre, akkor ezt a csatornát használja.

  • Szabványos hiba.  A parancs ezt a csatornát használja a hibajelentésekhez.

Ezen csatornák átirányításához a következő lehetőségek vannak:

Parancs > Fájl

A parancs kimenetét fájlba menti. Amennyiben ez egy létező fájl, akkor az törlésre kerül. Például az ls parancs a kimenetét a listing.txt fájlba menti:

ls > listing.txt
Parancs >> Fájl

A parancs kimenetét a fájlhoz fűzi. Például az ls parancs fájl kimenetét a listing.txt fájlhoz fűzi:

ls >> listing.txt
Parancs < Fájl

A fájlt a parancs beviteleként értelmezi. Például a read parancs beolvassa a fájl tartalmát az a változóba:

read a < foo
Parancs1 | Parancs2

A bal parancs kimenetét átirányítja a jobb parancs bemenetére. Például a cat parancs kimenete a /proc/cpuinfo fájl tartalma. Ezt a kimenetet használja a grep, hogy kiszűrje azokat a sorokat, amelyekben a cpu szerepel:

cat /proc/cpuinfo | grep cpu

Minden csatorna rendelkezik fájlleíróval: 0 (nulla) a szabványos bemenet, 1 a szabványos kimenet, a 2 pedig a szabványos hiba. Lehetőség van a fájlleírót a < vagy > karakterek elé tenni. Például a következő parancssor a foo kezdetű fájlokban keres, de a hibákkal nem foglalkozik, mivel azokat átirányítja a /dev/null-ba, a szemetesbe:

find / -name "foo*" 2>/dev/null

20.4. Álnevek használata

Az álnév egy vagy több parancs más néven történő hivatkozása. Ez hasznos lehet, ha a használt parancs nehezen megjegyezhető vagy sok paraméterrel rendelkezik. Egy álnév szintaxisa a következő:

alias NAME=DEFINITION

Például, a következő sor egy lt álnevet állít be, amely a hosszú formátumú kimenetet állít elő (az -l kapcsoló használatával), a módosítás dátuma szerint rendezi azokat (-t) és a listát fordított sorrendben jeleníti meg (-r):

alias lt='ls -ltr'

Az összes beállított álnevet az alias parancs segítségével lehet megjeleníteni. Az álnév eltávolításához az unalias parancsot lehet használni.

20.5. Változók használata a Bash parancsértelmezőben

A parancsértelmezőben egy változó lehet globális és lokális. A globális értékeket vagy a környezeti változókat az összes parancsértelmező eléri. Ezzel ellentétben a helyi változókat csak az aktuális parancsértelmező látja.

A környezeti változók megtekintéséhez a printenv parancsot kell használni. Amennyiben egy adott változó értékére kíváncsi, akkor azt paraméterként kell megadni:

printenv PATH

Mind a globális, mind a helyi változókat az echo paranccsal lehet kiíratni:

echo $PATH

Helyi változó megadásakor a változónév után egyenlőség jelnek, majd a változó értékének kell állnia:

PROJECT="SLED"

Az egyenlőség jel egyik oldalán se használjon szóközt, mert ez hibát okoz. Környezeti változó megadásakor az export parancsot kell használni:

export NAME="tux"

Változó eltávolításához az unset parancsot kell használni:

unset NAME

Az alábbi táblázat tartalmaz néhány általános környezeti változót, amelyet parancsfájlokban lehet használni:

20.5. táblázat - Hasznos környezeti változók

HOME

az aktuális felhasználó saját (home) könyvtára

HOST

az aktuális gép neve

LANG

amennyiben a használt eszköz vagy program több nyelven is elérhető, akkor ezt a változót használja a gépen használt nyelv megállapítására. Az angol C értékre is állítható.

PATH

a parancsértelmező keresési útvonalainak könyvtárlistája kettősponttal elválasztva

PS1

meghatározza a parancsok előtt megjelenő promptot

PS2

meghatározza a másodlagos promptot többsoros parancsok futtatásakor

PWD

aktuális munkakönyvtár

USER

aktuális felhasználó


20.5.1. Változók használata paraméterként

Például, ha van egy foo.sh nevű parancsfájl, akkor az így is futtatható:

foo.sh "Tux Penguin" 2000 

Ahhoz, hogy minden paraméter átadásra kerüljön a parancsfájl részére, megfelelően sorrendben kell megadni azokat. Ezek $1 az első paraméter esetén, $2 a másodiknál, és így tovább. Összesen kilenc paramétert lehet használni. A parancsfájl nevéhez a $0 paramétert kell használni.

Az alábbi foo.sh parancsfájl kiírja az összes paramétert 1-től 4-ig:

#!/bin/sh
echo \"$1\" \"$2\" \"$3\" \"$4\"

A parancsfájl futtatásakor a fenti paraméterek figyelembevételével a következő eredményt kapjuk:

"Tux Penguin" "2000" "" ""

20.5.2. Változók behelyettesítése

Változó behelyettesítéséhez a változó jobb vagy bal oldalán egy mintát kell használni. Az alábbi lista a lehetséges szintaxist tartalmazza:

${VAR#minta}

eltávolítja a legrövidebb lehetséges egyezést a bal oldalról:

file=/home/tux/book/book.tar.bz2
echo ${file#*/}
home/tux/book/book.tar.bz2
${VAR##minta}

eltávolítja a leghosszabb lehetséges egyezést a bal oldalról:

file=/home/tux/book/book.tar.bz2
echo ${file##*/}
book.tar.bz2
${VAR%minta}

eltávolítja a legrövidebb lehetséges egyezést a jobb oldalról:

file=/home/tux/book/book.tar.bz2
echo ${file%.*}
/home/tux/book/book.tar
${VAR%%minta}

eltávolítja a leghosszabb lehetséges egyezést a jobb oldalról:

file=/home/tux/book/book.tar.bz2
echo ${file%%.*}
/home/tux/book/book
${VAR/minta_1/minta_2}

behelyettesíti a VAR tartalmát a minta_1-ből, a minta_2-be:

file=/home/tux/book/book.tar.bz2
echo ${file/tux/wilber}
/home/wilber/book/book.tar.bz2

20.6. Parancsok csoportosítása és kombinálása

A parancsok feltételes végrehajtásához a parancsértelmező lehetőséget biztosít a parancsok összefűzésére és csoportosítására. Minden parancs egy kimeneti kóddal tér vissza, amely meghatározza, hogy a művelet sikeres vagy sikertelen volt. Amennyiben ez 0 (nulla), akkor a parancs végrehajtása sikeres volt, minden más esetben a parancsra jellemző hibát jelzi.

A parancsok a következőképpen csoportosíthatók:

Parancs1 ; Parancs2

a parancsokat egymást követően futtatja. A kimeneti kód nem kerül ellenőrzésre. A következő parancs megjeleníti a fájl tartalmát a cat parancs segítségével és kiírja a tulajdonságait az ls parancs használatával, függetlenül annak kimeneti kódjára:

cat filelist.txt ; ls -l filelist.txt
Parancs1 && Parancs2

a jobb oldali parancsot csak akkor futtatja, ha a baloldali sikeres volt (logikai ÉS). Az alábbi sor megjeleníti a fájl tartalmát és csak abban az esetben írja ki a fájl tulajdonságait, amennyiben az előző parancs sikeres volt (összehasonlítva az előző példával):

cat filelist.txt && ls -l filelist.txt
Parancs1 || Parancs2

a jobb oldali parancsot futtatja, ha a bal oldali parancs futtatása sikertelen (logikai VAGY). A következő sor csak akkor hoz létre a /home/wilber/bar könyvtárat, ha a /home/tux/foo könyvtár létrehozása sikertelen:

mkdir /home/tux/foo || mkdir /home/wilber/bar
függvénynév(){ ... }

parancsértelmező függvényt hoz létre. A pozicionált paramétereket lehet használni saját paramétereinek eléréséhez. Az alábbi sor egy hello függvényt definiál egy rövid üzenet kiírásához:

hello() { echo "Hello $1"; }

Ezt a függvényt a következőképpen lehet meghívni:

hello Tux

amely az alábbit fogja kiírni:

Hello Tux

20.7. Futásvezérlők használata

A parancsfájl futásának szabályozására a parancsértelmező a while, if, for és case vezérlőkkel rendelkezik.

20.7.1. Az if parancs

Az if parancs kifejezések vizsgálatára használható. Például a következő kód ellenőrzi, hogy a tux-e az aktuális felhasználó:

if test $USER = "tux" ;then
  echo "Hello Tux."
else
  echo "You are not Tux."
fi

A vizsgált kifejezés lehet rendkívül komplex és egyszerű is. Az alábbi kifejezés ellenőrzi, hogy létezik-e foo.txt fájl:

if test -e /tmp/foo.txt ; then
  echo "Found foo.txt"
fi

A vizsgált kifejezés rövidíthető szögletes zárójelbe is:

if [ -e /tmp/foo.txt ] ; then
  echo "Found foo.txt"
fi

További hasznos kifejezések a http://www.cyberciti.biz/nixcraft/linux/docs/uniqlinuxfeatures/lsst/ch03sec02.html weboldalon találhatók.

20.7.2. Hurok létrehozása a For parancs használatával

A for segítségével parancsok futtathatók egy lista elemein. Például, a következő kód az aktuális könyvtárban található PNG fájlokról jelenít meg információkat:

for i in *.png; do
 ls -l $i
done

20.8. További információk

A Bash parancsértelmezővel kapcsolatos fontos információk a man oldalakon találhatók: man sh. A témával kapcsolatban további információ a következő helyeken található: