diff --git a/share/spack/csh/spack.csh b/share/spack/csh/spack.csh
index 30c4ec136184efc0bce155e74cb11b461620a939..b21da23836423c09859ac3db72b8d271358fe124 100644
--- a/share/spack/csh/spack.csh
+++ b/share/spack/csh/spack.csh
@@ -46,8 +46,17 @@ set _sp_spec=""
 set _sp_modtype = ""
 switch ($_sp_subcommand)
 case cd:
+    shift _sp_args  # get rid of 'cd'
+
+    set _sp_arg=""
+    [ $#_sp_args -gt 0 ] && set _sp_arg = ($_sp_args[1])
     shift _sp_args
-    cd `spack location $_sp_args`
+
+    if ( "$_sp_arg" == "-h" ) then
+        \spack cd -h
+    else
+        cd `\spack location $_sp_arg $_sp_args`
+    endif
     breaksw
 case use:
 case unuse:
diff --git a/share/spack/setup-env.sh b/share/spack/setup-env.sh
index 6f56d4739b8c8625480f169fcde1300ba743dfe4..91b1dc46302abb503afeac5e1bc796697bd1d7bf 100755
--- a/share/spack/setup-env.sh
+++ b/share/spack/setup-env.sh
@@ -76,7 +76,12 @@ function spack {
     # command.
     case $_sp_subcommand in
         "cd")
-            cd $(spack location "$@")
+            _sp_arg="$1"; shift
+            if [ "$_sp_arg" = "-h" ]; then
+                command spack cd -h
+            else
+                cd $(spack location $_sp_arg "$@")
+            fi
             return
             ;;
         "use"|"unuse"|"load"|"unload")