diff --git a/require.c b/require.c
index 43edffe43db63a3322fd64e50746d2b99f1f1031..e22c6e1a986591c505d742cf2bb30017e2b7c351 100644
--- a/require.c
+++ b/require.c
@@ -638,6 +638,7 @@ void registerModule(const char* module, const char* version, const char* locatio
     putenvprintf("%s_VERSION=%s", module, version);
     if (location)
     {
+        putenvprintf("MODULE_DIR=%s", m->content+lm+lv);
         putenvprintf("%s_DIR=%s", module, m->content+lm+lv);
         pathAdd("SCRIPT_PATH", m->content+lm+lv);
     }
diff --git a/runScript.c b/runScript.c
index daf79fa343ed257ac9be183d4447db286bf374a7..62a949849a11a35a4fa621361b1bd2131330174e 100644
--- a/runScript.c
+++ b/runScript.c
@@ -50,6 +50,9 @@ epicsShareFunc int epicsShareAPI iocshCmd(const char *cmd);
 #include "expr.h"
 #include "require.h"
 
+#define SAVEENV(var) do { old_##var = getenv(#var); if (old_##var) old_##var=strdup(old_##var); } while(0)
+#define RESTOREENV(var) do { if(old_##var) { putenvprintf("%s=%s", #var, old_##var); free(old_##var); }} while(0)
+
 int runScriptDebug=0;
 
 int runScript(const char* filename, const char* args)
@@ -63,6 +66,8 @@ int runScript(const char* filename, const char* args)
     long len;
     char** pairs;
     int status = 0;
+    char* old_MODULE = NULL;
+    char* old_MODULE_DIR = NULL;
     
     if (!filename)
     {
@@ -161,8 +166,12 @@ int runScript(const char* filename, const char* args)
         }
     }
     if (file == NULL) { perror(filename); return errno; }
+    
+    /* save some environments variables */
+    SAVEENV(MODULE);
+    SAVEENV(MODULE_DIR);
 
-    /*  line by line after expanding macros with arguments or environment */
+    /* execute script line by line after expanding macros with arguments or environment */
     while (fgets(line_raw, line_raw_size, file))
     {
         char* p, *x;
@@ -246,6 +255,11 @@ end:
     free(line_exp);
     if (mac) macDeleteHandle(mac);
     if (file) fclose(file);
+
+    /* restore environment */
+    RESTOREENV(MODULE);
+    RESTOREENV(MODULE_DIR);
+
     return status;
 }