Da in der Bash die Variablen grundsätzlich global sind, ist es ein leichtes, eine Aktion zu cachen. Man muss nur bei der Aktion eine Variable füllen und diese bei der nächsten Ausführung überprüfen:
#!/bin/bash
f() {
#wenn $cached unbelegt/leer ist
if [[ -z "$cached" ]];then
todo="done"
cached="true"
echo "uncached"
fi
echo "$todo"
}
f #=> uncached done
f #=> done
f #=> done
Die Subshells allerdings verhindern, dass man dieses Prinzip immer einsetzen kann. Würde das in einer Subshell stecken, wäre cached beim nächsten Durchlauf wieder leer:
f() {
if [[ -z "$cached" ]];then
todo="done"
cached="true"
echo "uncached"
fi
echo "$todo"
}
echo $(f) #=> uncached done
echo $(f) #=> uncached done
echo $(f) #=> uncached done