Parancsszerkesztési lehetőségek a C shell-ben

A C shell számos parancsszerkesztési lehetőséget kínál, ezek lehetővé teszik, hogy az előző parancsok átszerkesztésével megspóroljuk a hosszú parancsok újragépelését, illetve régebben begépelt parancsokat és parancssorozatokat könnyűszerrel megismételjünk. Ennek megvalósítására a C shell egy eseménypuffert (event buffer) definiál, s az utoljára begépelt parancsokat e pufferban tárolja. Amikor parancsszerkesztést hajtunk végre, a shell ennek a puffernak a tartalmán operál. Lehetőségünk van többek között arra, hogy előző eseményeket (parancsokat) teljesen megismételjünk, vagy különböző parancsokból más-más részeket, argumentumokat összeollózva állítsunk össze végrehajtandó parancsokat stb.

Parancshistória megtekintése

A shell által tárolt parancsok listáját a history paranccsal nyerhetjük elő:

hp 21: history

2 exit

3 mailx

4 cat .cshrc

5 cat .login

6 env

7 set lo=1

8 echo $lo

9 set lo = 2

10 echo $lo

11 nslookup lwr.camaz.mx

12 nslookup

13 ping lwr.camaz.mx

14 /etc/ping lwr.camaz.mx

15 ping 192.93.224.53

16 /etc/ping 192.93.224.53

17 /etc/ping 192.93.224.11

18 telnet lwr.camaz.mx

19 telnet lwserv.camaz.mx

20 finger icl@lwr.camaz.mx

21 history

hp 22:

Parancsok ismételt végrehajtása

Az előző parancsokat a megadott eseményre való hivatkozással lehet újra végrehajtatni. Az eseményekre háromféleképpen lehet hivatkozni:

- az esemény sorszámával;

- az esemény relatív elhelyezkedésével a pillanatnyi eseményhez képest;

- az esemény szövegével, vagy abból kiemelt mintával.

A fentiek speciális eseteként a legutoljára végrehajtott parancsot a !! karakterekkel tudjuk végrehajtani. E jelölésből az első felkiáltójel a parancsbehelyettesítési mechanizmust indítja, a második pedig a legutolsónak végrehajtott parancsra hivatkozik.

Hivatkozás az esemény sorszámával

Az esemény sorszámára való hivatkozáskor a kezdő felkiáltójel után az újra végrehajtatni kívánt parancs esemény sorszámát kell megadni. Ezt az információt persze csak akkor tudjuk használni, ha valamilyen formában rendelkezésünkre áll; ha a promptunk nem írja ki az eseménysorszámot, definiáljuk át a .cshrc fájlban a prompt változót úgy, hogy az az alábbiakat (is) tartalmazza:

set prompt = "\!% "

Az előzőekben példaként bemutatott history lista alapján például a !10 parancs hatására az echo $lo parancs fog újra végrehajtódni:

hp 22: !10

echo $lo

2

hp 23:

Végrehajtás előtt az ismétlendő parancsot kiírja a shell, tehát látjuk, hogy mit hajtunk végre; módosítani viszont, legalábbis ez esetben, nem tudjuk a parancsot.

Hivatkozás az esemény relatív elhelyezkedésével

E hivatkozási mód alapvetően hasonlít az előzőhöz, az eltérés annyi, hogy nem egy abszolút sorszám alapján azonosítjuk az újra végrehajtandó parancsot, hanem a pillanatnyi eseménysorszámhoz képest adjuk meg pozícióját. Ha például promptunk a 23 értéket mutatja, a !-20 parancs hatására a mailx parancs fog végrehajtódni:

hp 23: !-20

mailx

No mail for demo

hp 24:

Előfordulhat, hogy az ily módon megadott eseményre a shell az "Event not found." hibaüzenettel reagál. Ez főként akkor fordul elő, ha olyan eseményre hivatkozunk, ami már kiesett az eseménypufferünkből. (A puffer méretét a history shell-változóban állíthatjuk be, általában 15-20 körüli értékre; ha mondjuk 20 a beállított érték, az ezelőtti huszonkettedik parancsot nem tudjuk már elővarázsolni.)

Hivatkozás az esemény szövegével

Az esemény szövegére történő hivatkozás a legegyszerűbb: a felkiáltójel után egyszerűen gépeljük be a megismételni kívánt parancs első néhány betűjét, annyit, ami egyértelműen megkülönbözteti az eseménypufferben lévő többi parancstól. Például a !ma parancs hatására a mailx parancs fog újra lefutni:

hp 24: !ma

mailx

No mail for demo

hp 25:

Az ilyen "eseményillesztés" határa az első fehér karakter (szóköz, tabulátor); a C shell csak az eddig terjedő részt használja az eseményillesztésnél, az általunk megadott minta többi részét a megtalált parancsnak adja át argumentumként. Az alábbi példában az

!ls -l

parancs megadásakor nem az általunk gondolt ls -l parancsot (#38) fogja illeszteni a C shell, hanem, mivel az eseményillesztésnél használt ls több parancsra is illett, azok közül veszi az utolsót (#39), s ahhoz fűzi hozzá argumentumként a -l opciót:

hp 40: history

37 ls -a

38 ls -l

39 ls /etc

40 history

hp 41: !ls -l

ls /etc -l

itt a /etc katalóguslistája közetkezik...

-l not found

hp 42:

Gyakran kézenfekvőbb lenne, ha nem a parancsszó, hanem a parancs tetszőleges része alapján tudnánk az előző parancsokra hivatkozni. Ilyenkor a !?minta? megadást használhatjuk, ahol minta a keresett parancsban bárhol szereplő karaktersorozat lehet. Az előbbi példánál maradva:

hp 43: !?-l?

ls -l

total 378

-rw-rw-rw- 1 demo guest 166262 Aug 23 20:29 FULL-INDEX

-rw-rw-rw- 1 demo guest 14 Aug 29 16:53 akarmi

-rw-rw-rw- 1 demo guest 530 Aug 29 16:46 file

-rw-r-xr-x 1 demo guest 18 Aug 23 20:42 file1

drwxrwxrwx 3 demo guest 1024 Aug 23 20:59 newdir

-rw-rw-rw- 1 demo guest 18 Aug 23 20:42 newfile

-rw-rw-rw- 1 demo guest 18 Aug 23 20:43 newfilee2

-rwxrwxrwx 1 demo guest 11 Aug 30 21:03 nf

-rwxrwxrwx 1 demo guest 14 Sep 2 09:51 nf1

-rw-rw-rw- 1 root sys 31 Sep 1 13:45 ravasz

-rw-rw-rw- 1 demo guest 13 Aug 29 16:53 semmi

lrwxrwxrwx 1 demo guest 20 Aug 23 23:14 sendmail.cf ->
/usr/lib/sendmail.cf

-rw-rw-rw- 1 demo guest 54 Aug 29 16:57 temp

-rw-rw-rw- 2 demo guest 18 Aug 23 20:59 text

hp 44:

Parancs argumentumok újra felhasználása

E mechanizmus arra ad lehetőséget, hogy ne csak teljes parancsokat hajtsunk végre az eseménypufferből, hanem az előző események parancs argumentumait önálló építőkockákként használjuk fel. A C shell ugyanis nem csak magukat a végrehajtott eseményeket számozza meg, de az egyes parancsok argumentumait is. Egy tetszőleges argumentumra úgy hivatkozhatunk, hogy az előzőekben látott bármelyik módszerrel megnevezzük a parancsot, amelyben a kívánt argumentum előfordult, majd egy kettőspont (:) karakter után az alább ismertetendő módon hivatkozunk az argumentumra.

Az argumentumokra a Bourne shell-nél látott módon, mint sorszámokra hivatkozunk, a különbség az, hogy most nem kell őket a dollár ($) jelnek megelőznie. Például a !18:0 hatására a telnet szó fog behelyettesítődni, mert a 18-as esemény sorszámú parancs nulladik paramétere maga a parancs neve, esetünkben a telnet.

Két kényelmi jelölés is rendelkezésre áll: a csákó (^) karakter a mindenkori második szóra, tehát rendszerint a parancsnevet követő első argumentumra hivatkozik, a dollár ($) karakter pedig a legutolsó szót jelöli. Végül a csillag (*) karakterrel az első (azaz a számozásban a nulladik) argumentumot követő összes argumentumra hivatkozhatunk. Egy példa talán világosabbá teszi a dolgokat: ha a parancs, amiből csemegézünk a 13. esemény sorszámú volt és így nézett ki:

cat alma korte repa

akkor

!13:0=cat, !13:1=alma, !13:2=korte, !13:3=repa, !13:^=alma, !13:$=repa és !13:*="alma korte repa".

Lehetőség van arra is, hogy ne csak egy, hanem több egymást követő argumentumra is hivatkozzunk, ilyenkor a kettőspont után egy kötőjellel elválasztott listát lehet megadni. A !7:3-$ jelölés például a hetedik parancs összes paraméterét kijelöli, a harmadiktól kezdve.

E mechanizmus használhatóságát nagymértékben növeli az a tény, hogy tetszőleges helyre beszúrhatóak az ily módon megjelölt argumentumok, és egy parancsot több helyről vett "fődarabokból" barkácsolhatunk össze.

A C shell egy nagyon fontos tulajdonságára kell itt felhívnunk az olvasó figyelmét: a fenti argumentum behelyettesítési eljárásban a C shell kicsit másképpen értelmezi az argumentum fogalmát, mint ahogy azt a Bourne shell-nél láttuk. A Bourne shell-nél argumentumnak csak azokat a karaktersorozatokat neveztük, amelyeket a végrehajtandó parancsnak átadott a shell, tehát például az átirányításra vonatkozó metakaraktereket (<, >, >>) nem, hiszen ezeket a shell maga dolgozta fel, a végrehajtandó program ezek létezéséről nem tudott, nem is tudhatott. A C shell azonban a fontosabb metakaraktereket önálló argumentumként kezeli, legalábbis a fenti argumentum behelyettesítési eljárás során.

Előző események módosítása

A fentiekben már látott eszközökkel módunk van arra, hogy előző parancsokból átvett darabokkal operáljunk. Az alább következő eszközökkel lehetőségünk nyílik arra is, hogy módosítsuk az így előállított új parancsot. E célra az úgynevezett eseménymódosítók szolgálnak, melyek listáját az alábbiakban közöljük.

Az eseménymódosítókat, akárcsak az argumentumokra történő hivatkozásokat, a kettőspont (:) karakter előzi meg.

Ha egy teljes előző eseményre hivatkozunk, s ez után szerepel eseménymódosító, akkor annak hatása az egész kijelölt eseményre érvényes lesz. Ha egy eseményből argumentumokat jelöltünk ki, akkor az eseménymódosító hatása arra az argumentumra terjed ki, amelyik után szerepel. Egy argumentum vagy esemény után több eseménymódosítót is megadhatunk.

Az eseménymódosítók listája a következő:

S/old/new

Az old string első előfordulását lecseréli a new stringre. Ha a new stringben az 'at' (&) jel szerepel, akkor annak helyére behelyettesítődik az old string. Fontos megjegyezni, hogy csak egyszeres behelyettesítést végez ez a parancs, ha többször akarjuk végrehajtani, a g eseménymódosítót is használnunk kell.

G

Önmagában nem, csak más eseménymódosítókkal együtt használható, az előző módosító (tipikusan az s) hatását a teljes parancssorra kiterjeszti. Ha például egy parancssorban az összes old stringet a new stringre kell cserélnünk, a gs/old/new paranccsal érjük el a kívánt eredményt. Vigyázzunk! Egy parancsargumentumon belül csak egy helyettesítés hajtható végre, még a g eseménymódosító megadása esetén is, tehát ha például a

mv /usr/src/srclib /tmp parancsban szeretnénk az első fájlnevet /usr/oldsrc/oldsrclib névre cserélni, a gs/src/old& parancs hatására is csak a

mv /usr/oldsrc/srclib /tmp eredményt kapjuk. Ugyanakkor a

mv /usr/src /usr/lib/src /tmp parancsra kiadva a fenti módosítókat, a várakozásunknak megfelelő eredményt kapjuk, azaz a

mv /usr/oldsrc /usr/lib/oldsrc /tmp parancsot, hiszen a g flagnek megfelelően mindegyik argumentumban megtörtént a csere - egyszer.

P

A megnevezett eseményt kilistázza a képernyőre, de nem hajtja végre. Ez kivált akkor lehet hasznos a számunkra, ha egy komplex parancsot akarunk editálni, és nem vagyunk biztosak abban, hogy egy lépcsőben végre tudjuk hajtani az összes módosítást.

q

Nem engedélyez további módosításokat az adott argumentumon.

h

A fájlnévnek tekintett argumentumról levágja az utolsó fájlnév komponenst, azaz csak a katalógus részt hagyja meg. Például a /usr/src/proba.c.1 névből e módosító hatására /usr/src lesz.

t

A h módosító ellentéte: a fájlnévnek tekintett argumentum utolsó névelemét tartja csak meg, azaz levágja a katalógus-részt. A /usr/src/proba.c.1 fájlnévből a proba.c.1 részt hagyja meg.

r

A fájlnévnek tekintett argumentum kiterjesztését (azaz az utolsó pont (.) karakter utáni részt, ha van olyan) levágja, tehát például a proba.c.1 fájlnévből proba.c lesz.

&

Megismétli a legutoljára végrehajtott helyettesítési műveletet. Ez a flag használható például az s eseménymódosító "kicselezésére", amikor egy argumentumon belül szeretnénk többszörös helyettesítéseket végrehajtani.

 

Tartalomjegyzék