( locsemege | 2012. 10. 17., sze – 13:36 )

A bash-nek talán két titka van. Az egyik a helyettesítés, a másik pedig az, hogy vannak adott helyen adott karakterek, amelyeket speciálisan, magára nézvést értelmez, így ha ezt nem szeretnéd, el kell zárni a shelltől backslash-sel, idézőjellel, aposztroffal, bár ezek nem pont ugyanazt jelentik. A helyettesítést olyannyira komolyan gondolja a shell, hogy a parncsot, a paramétereket, bármit helyettesíthetsz változóból. Így tehát a $valami szintaxist akár sor elején is használhatod.

Ami még sok bosszúságot okozhat, hogy a pipe-ban futó programok külön process-ben futnak, így nem látnak rá egymás memóriaterületére. Elsőre talán meglepő az alábbi:

a='alma'; echo 'korte' | read a; echo "$a"
alma

Itt a read a egy subshellben futott, másik PID-del, mint az a shell, ahol ez az egész fut, így ugyan az 'a' változó megkapta a 'korte' értéket, ám az egy másik shell másik változója volt. A végén befejeződött a működése, s az a memóriaterület fel is számolódott, a szülő shell 'a' változója pedig érintetlen maradt. Ha erre nem figyel az ember, kitépi az összes haját. Amúgy ez a jelenség az alkönyvtárakat bejáró algoritmusban is jelen van, csak ott nem gond, a pipe-ban szereplő while ciklusból nem akartunk változót kihozni, úgyértem átadni a szülő shellnek.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE