fn(){ printf %s\n "${v-not set}"; }
v=value; fn; unset v; fn
value
not set
Uma função shell é uma string literal armazenada na memória do shell. Na definição de tempo, ele é analisado, mas não é avaliado para expansões (além de aliases de shell) ou redirecionamentos. Estes são avaliados apenas no tempo de chamada .
De fato, e um tanto relacionado, desta forma é possível obter uma função para definir sua própria entrada com um novo arquivo temporário em cada chamada.
fn(){ ls -l /dev/fd/0; cat; } <<INFILE
$@
INFILE
fn some args; fn other args
#in dash
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:50 /dev/fd/0 -> pipe:[4076148]
some args
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:50 /dev/fd/0 -> pipe:[4077081]
other args
#bash
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:51 /dev/fd/0 -> /tmp/sh-thd-1036060995 (deleted)
some args
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:51 /dev/fd/0 -> /tmp/sh-thd-531856742 (deleted)
other args