diff --git a/share/spack/setup-env.csh b/share/spack/setup-env.csh
index edbf51e8e283f649e7bf849d4831ad54bb7e937f..1985e023ded41621bd7ade75208eb1c17978aa2e 100755
--- a/share/spack/setup-env.csh
+++ b/share/spack/setup-env.csh
@@ -12,6 +12,13 @@
 #    setenv SPACK_ROOT /path/to/spack
 #    source $SPACK_ROOT/share/spack/setup-env.csh
 #
+
+# prevent infinite recursion when spack shells out (e.g., on cray for modules)
+if ($?_sp_initializing) then
+    exit 0
+endif
+setenv _sp_initializing true
+
 if ($?SPACK_ROOT) then
     set _spack_source_file = $SPACK_ROOT/share/spack/setup-env.csh
     set _spack_share_dir   = $SPACK_ROOT/share/spack
@@ -38,3 +45,6 @@ else
     echo "ERROR: Sourcing spack setup-env.csh requires setting SPACK_ROOT to "
     echo "       the root of your spack installation."
 endif
+
+# done: unset sentinel variable as we're no longer initializing
+unsetenv _sp_initializing
diff --git a/share/spack/setup-env.fish b/share/spack/setup-env.fish
index a534f09ee9a0a25fff77836c3baab617281624e7..dd2a17f74f5dc03d697b7f6a88cb1e9d8460e16c 100755
--- a/share/spack/setup-env.fish
+++ b/share/spack/setup-env.fish
@@ -36,6 +36,12 @@
 # to come up with a user-friendly naming scheme for spack dotfiles.
 #################################################################################
 
+# prevent infinite recursion when spack shells out (e.g., on cray for modules)
+if test -n "$_sp_initializing"
+    exit 0
+end
+set -x _sp_initializing true
+
 
 #
 # Test for STDERR-NOCARET feature: if this is off, fish will redirect stderr to
@@ -721,3 +727,6 @@ sp_multi_pathadd MODULEPATH $_sp_tcl_roots
 # [3]: When the test in the if statement fails, the `status` flag is set to 1.
 #      `true` here manuallt resets the value of `status` to 0. Since `set`
 #      passes `status` along, we thus avoid the function returning 1 by mistake.
+
+# done: unset sentinel variable as we're no longer initializing
+set -e _sp_initializing
diff --git a/share/spack/setup-env.sh b/share/spack/setup-env.sh
index 032247cd8f3c0204aea0dfb7b6db4afb70ca409c..9d984ae199944259b78d309765a95ff761cb5e9b 100755
--- a/share/spack/setup-env.sh
+++ b/share/spack/setup-env.sh
@@ -39,6 +39,12 @@
 # spack module files.
 ########################################################################
 
+# prevent infinite recursion when spack shells out (e.g., on cray for modules)
+if [ -n "${_sp_initializing:-}" ]; then
+    exit 0
+fi
+export _sp_initializing=true
+
 spack() {
     # Store LD_LIBRARY_PATH variables from spack shell function
     # This is necessary because MacOS System Integrity Protection clears
@@ -357,3 +363,7 @@ _sp_multi_pathadd MODULEPATH "$_sp_tcl_roots"
 if [ "$_sp_shell" = bash ]; then
     source $_sp_share_dir/spack-completion.bash
 fi
+
+# done: unset sentinel variable as we're no longer initializing
+unset _sp_initializing
+export _sp_initializing