Cuando ejecuta un script de shell, se hace en un sub-shell por lo que no puede afectar el entorno del shell principal. Desea obtener el script haciendo:
. ./setfoo.sh
Esto lo ejecuta en el contexto del shell actual , no como un sub shell.
Desde la página de manual de bash:
. nombre de archivo [argumentos]
nombre de archivo de origen [argumentos]
Leer y ejecutar comandos desde el nombre de archivo en el entorno de shell actual y devolver el estado de salida del último comando ejecutado desde el nombre de archivo.
Si el nombre de archivo no contiene una barra, los nombres de archivo en PATH se utilizan para encontrar el directorio que contiene el nombre de archivo.
No es necesario que el archivo buscado en PATH sea ejecutable. Cuando bash no está en modo POSIX, se busca en el directorio actual si no se encuentra ningún archivo en PATH.
Si la opción sourcepath del comando integrado shopt está desactivada, no se busca en PATH.
Si se proporcionan argumentos, se convierten en parámetros posicionales cuando se ejecuta filename.
De lo contrario, los parámetros posicionales no se modifican. El estado de retorno es el estado del último comando que salió dentro del script (0 si no se ejecutan comandos) y falso si no se encuentra el nombre del archivo o no se puede leer.