Next: Examples, Previous: Introduction, Up: General Introduction
Here’s pm-gawk
in action at the bash
shell prompt (‘$’):
$ truncate -s 4096000 heap.pma $ export GAWK_PERSIST_FILE=heap.pma $ gawk 'BEGIN{myvar = 47}' $ gawk 'BEGIN{myvar += 7; print myvar}' 54
First, truncate
creates an empty (all-zero-bytes) heap
file where pm-gawk
will store script variables; its size is a multiple
of the system page size (4 KiB). Next, export
sets an
environment variable that enables pm-gawk
to find the heap file; if
gawk
does not see this envar, persistence is not activated.
The third command runs a one-line AWK script that initializes variable
myvar
, which will reside in the heap file and thereby outlive
the interpreter process that initialized it. Finally, the fourth
command invokes pm-gawk
on a different one-line script that
increments and prints myvar
. The output shows that pm-gawk
has
indeed “remembered” myvar
across executions of unrelated
scripts. (If the gawk
executable in your search $PATH
lacks
the persistence feature, the output in the above example will be
‘7’ instead of ‘54’. See Installation.) To disable
persistence until you want it again, prevent gawk
from finding the
heap file via unset GAWK_PERSIST_FILE
. To permanently
“forget” script variables, delete the heap file.
Toggling persistence by export
-ing and unset
-ing
“ambient” envars requires care: Forgetting to unset
when
you no longer want persistence can cause confusing bugs. Fortunately,
bash
allows you to pass envars more deliberately, on a
per-command basis:
$ rm heap.pma # start fresh $ unset GAWK_PERSIST_FILE # eliminate ambient envar $ truncate -s 4096000 heap.pma # create new heap file $ GAWK_PERSIST_FILE=heap.pma gawk 'BEGIN{myvar = 47}' $ gawk 'BEGIN{myvar += 7; print myvar}' 7 $ GAWK_PERSIST_FILE=heap.pma gawk 'BEGIN{myvar += 7; print myvar}' 54
The first gawk
invocation sees the special envar prepended on the
command line, so it activates pm-gawk
. The second gawk
invocation,
however, does not see the envar and therefore does not access
the script variable stored in the heap file. The third gawk
invocation does see the special envar and therefore uses the script
variable from the heap file.
While sometimes less error prone than ambient envars, per-command envar passing as shown above is verbose and shouty. A shell alias saves keystrokes and reduces visual clutter:
$ alias pm='GAWK_PERSIST_FILE=heap.pma' $ pm gawk 'BEGIN{print ++myvar}' 55 $ pm gawk 'BEGIN{print ++myvar}' 56
Next: Examples, Previous: Introduction, Up: General Introduction