A bemenet átirányítása

Az eddigiekben a cat parancs is, a sort parancs is egy-egy állomány nevét kapta argumentumként. Valójában mindkettő használható paraméter nélkül is:

tux@madas:~/public_html/txt/mp$ cat
áj
áj
ág
ág
őr
őr
tux@madas:~/public_html/txt/mp$ 

A cat parancs a szabványos bemenetről (a standard inputról, esetünkben a billentyűzetről) várja az adatokat, majd földolgozás után a szabványos kimentre küldi az eredményt. A földolgozás ebben az esetben érdemi munkát nem jelent: amit a bemeneten kap, azt továbbadja a kimenetre. Ennek megfelelően keverednek a sorok a fenti példában: a páratlan sorszámúak billentyűzetről kapott bemeneti sorok, a páros sorszámúak –szintén– képernyőre küldött kimeneti sorok. (A bemenet végét a Ctrl-D billentyűkombinációval jeleztük.)

Próbáljuk ki a sort parancsot ugyanezzel a –billentyűzetről kapott– bemenettel:

tux@madas:~/public_html/txt/mp$ sort
áj 
kő
ág
bő
őr
sé
ág
áj


őr

tux@madas:~/public_html/txt/mp$ 

A sort parancs megvárja, amíg Ctrl-D-vel jelezzük a bemenet végét. Ez valójában magától értődik: ez a parancs csak akkor tud hozzáfogni az adatok földolgozásához, ha mindegyik rendelkezésre áll már, hiszen lehetséges, hogy az utolsóként megkapott sor lesz az eredmény első sora.

Az előző bekezdésben írtak leegyszerűsítik a valóságot: a rendezéshez hozzá lehet fogni akkor is, ha az adatoknak még csak egy részét kaptuk meg. És mivel a unix sort parancsa a Neumann János által 1945-ben leírt összefésüléses rendezés algoritmusát követi, erre meg is van a lehetőség, sőt, egykor ez szükségszerű volt: a mai szemmel nézve hihetetlenül kevés memóriával rendelkező korai számítógépek négy mágnesszalagos egység segítségével tudtak nagy mennyiségű adatot rendezni. Részletesebben lásd a Merge sort szócikket a wikipédián.

Pontosabban fogalmazva tehát: a sort parancs csak akkor írhatja ki az eredményt, ha a teljes bemenetet földolgozta már.

Gyakorlati szempontból elég haszontalannak tűnik a következő példa (is), de szokjuk vele a grep parancsot (meg jobban érthetjük, mit jelent a bemenet-kimenet sorainak keveredése):

tux@madas:~/public_html/txt/mp$ grep á
áj
áj
kő
ág
ág
bő
őr 
sé
tux@madas:~/public_html/txt/mp$ 

Miért kellett a múltkor idézőjelet használni a grep paraméteréhez?

Mind a fenti példák egyetlen célt szolgáltak: annak előkészítését, hogy a fenti parancsok bemenete (egy halom továbbiéval együtt) átiránytható:

tux@madas:~/public_html/txt/mp$ grep simon < ksh_hnk_1913.txt
simonyifalva
simony
simontelke
csíkszentsimon
simon
szentsimon
rimasimonyi
nyárádszentsimon
simonfa
somogysimonyi
simonmajor
simontornya
nagysimonyi
tux@madas:~/public_html/txt/mp$ sort < ksh_hnk_1913.txt > temp
tux@madas:~/public_html/txt/mp$ wc ksh_hnk_1913.txt temp
 12538  12548 137383 ksh_hnk_1913.txt
 12538  12548 137383 temp
 25076  25096 274766 összesen
tux@madas:~/public_html/txt/mp$ 

Az ember hajlamos azt hinni, hogy a paraméterként átadott állománynév, illetve a bemenet átirányítása (ugyanabból az) állományból egyenértékű, de ez nem egészen így van. Ha mást nem is, annyit már most érdemes lehet megjegyezni, hogy ha paraméterként adunk meg egy állománynevet, akkor azt a parancs „látja”; ha a parancs bemenetét irányítjuk át, akkor a parancs a parancsértelemzőtől a bemenet sorait kapja meg, és „nincs tudomása” arról, hogy ezek a sorok honnan (melyik állományból) származnak.