diff --git a/lib/spack/env/cc b/lib/spack/env/cc
index 2eb6f46afe5af25864741919b9f2ee9f1076e0e6..18fd8f7bdb1f28f071f7c52255a3cda624d35c6e 100755
--- a/lib/spack/env/cc
+++ b/lib/spack/env/cc
@@ -39,7 +39,7 @@
 #
 
 # This is the list of environment variables that need to be set before
-# the script runs.  They are set by routines in spack.build_environment
+# the script runs. They are set by routines in spack.build_environment
 # as part of spack.package.Package.do_install().
 parameters="
 SPACK_PREFIX
@@ -50,7 +50,7 @@ SPACK_SHORT_SPEC"
 
 # The compiler input variables are checked for sanity later:
 #   SPACK_CC, SPACK_CXX, SPACK_F77, SPACK_FC
-# Debug flag is optional; set to true for debug logging:
+# Debug flag is optional; set to "TRUE" for debug logging:
 #   SPACK_DEBUG
 # Test command is used to unit test the compiler script.
 #   SPACK_TEST_COMMAND
@@ -66,11 +66,10 @@ function die {
 
 for param in $parameters; do
     if [[ -z ${!param} ]]; then
-        die "Spack compiler must be run from spack!  Input $param was missing!"
+        die "Spack compiler must be run from Spack! Input '$param' is missing."
     fi
 done
 
-#
 # Figure out the type of compiler, the language, and the mode so that
 # the compiler script knows what to do.
 #
@@ -78,19 +77,18 @@ done
 # 'command' is set based on the input command to $SPACK_[CC|CXX|F77|F90]
 #
 # 'mode' is set to one of:
+#    vcheck  version check
 #    cpp     preprocess
 #    cc      compile
 #    as      assemble
 #    ld      link
 #    ccld    compile & link
-#    vcheck  version check
-#
-# Depending on the mode, we may or may not add extra rpaths.
-# This variable controls whether they are added.
-add_rpaths=true
 
 command=$(basename "$0")
 case "$command" in
+    cpp)
+        mode=cpp
+        ;;
     cc|c89|c99|gcc|clang|icc|pgcc|xlc)
         command="$SPACK_CC"
         language="C"
@@ -107,34 +105,20 @@ case "$command" in
         command="$SPACK_F77"
         language="Fortran 77"
         ;;
-    cpp)
-        mode=cpp
-        ;;
     ld)
         mode=ld
-
-        # Darwin's linker has a -r argument that merges object files
-        # together. It doesn't work with -rpath.
-        if [[ $OSTYPE = darwin* ]]; then
-            for arg in "$@"; do
-                if [ "$arg" = -r ]; then
-                    add_rpaths=false
-                    break
-	            fi
-            done
-        fi
         ;;
     *)
         die "Unkown compiler: $command"
         ;;
 esac
 
-# If any of the arguments below is present then the mode is vcheck. In
-# vcheck mode nothing is added in terms of extra search paths or
-# libraries
-if [ -z "$mode" ]; then
+# If any of the arguments below are present, then the mode is vcheck.
+# In vcheck mode, nothing is added in terms of extra search paths or
+# libraries.
+if [[ -z $mode ]]; then
     for arg in "$@"; do
-        if [ "$arg" = -v -o "$arg" = -V -o "$arg" = --version -o "$arg" = -dumpversion ]; then
+        if [[ $arg == -v || $arg == -V || $arg == --version || $arg == -dumpversion ]]; then
             mode=vcheck
             break
     fi
@@ -142,16 +126,16 @@ if [ -z "$mode" ]; then
 fi
 
 # Finish setting up the mode.
-if [ -z "$mode" ]; then
+if [[ -z $mode ]]; then
     mode=ccld
     for arg in "$@"; do
-        if [ "$arg" = -E ]; then
+        if [[ $arg == -E ]]; then
             mode=cpp
             break
-        elif [ "$arg" = -S ]; then
+        elif [[ $arg == -S ]]; then
             mode=as
             break
-        elif [ "$arg" = -c ]; then
+        elif [[ $arg == -c ]]; then
             mode=cc
             break
         fi
@@ -159,7 +143,7 @@ if [ -z "$mode" ]; then
 fi
 
 # Dump the version and exit if we're in testing mode.
-if [ "$SPACK_TEST_COMMAND" = "dump-mode" ]; then
+if [[ $SPACK_TEST_COMMAND == dump-mode ]]; then
     echo "$mode"
     exit
 fi
@@ -170,10 +154,23 @@ if [[ -z $command ]]; then
     die "ERROR: Compiler '$SPACK_COMPILER_SPEC' does not support compiling $language programs."
 fi
 
-if [ "$mode" == vcheck ] ; then
+if [[ $mode == vcheck ]]; then
     exec ${command} "$@"
 fi
 
+# Darwin's linker has a -r argument that merges object files together.
+# It doesn't work with -rpath.
+# This variable controls whether they are added.
+add_rpaths=true
+if [[ mode == ld && $OSTYPE == darwin* ]]; then
+    for arg in "$@"; do
+        if [[ $arg == -r ]]; then
+            add_rpaths=false
+            break
+        fi
+    done
+fi
+
 # Save original command for debug logging
 input_command="$@"
 args=("$@")
@@ -183,17 +180,17 @@ IFS=':' read -ra deps <<< "$SPACK_DEPENDENCIES"
 for dep in "${deps[@]}"; do
     # Prepend include directories
     if [[ -d $dep/include ]]; then
-        if [[ $mode = cpp || $mode = cc || $mode = as || $mode = ccld ]]; then
+        if [[ $mode == cpp || $mode == cc || $mode == as || $mode == ccld ]]; then
             args=("-I$dep/include" "${args[@]}")
         fi
     fi
 
     # Prepend lib and RPATH directories
     if [[ -d $dep/lib ]]; then
-        if [[ $mode = ccld ]]; then
+        if [[ $mode == ccld ]]; then
             $add_rpaths && args=("-Wl,-rpath,$dep/lib" "${args[@]}")
             args=("-L$dep/lib" "${args[@]}")
-        elif [[ $mode = ld ]]; then
+        elif [[ $mode == ld ]]; then
             $add_rpaths && args=("-rpath" "$dep/lib" "${args[@]}")
             args=("-L$dep/lib" "${args[@]}")
         fi
@@ -201,10 +198,10 @@ for dep in "${deps[@]}"; do
 
     # Prepend lib64 and RPATH directories
     if [[ -d $dep/lib64 ]]; then
-        if [[ $mode = ccld ]]; then
+        if [[ $mode == ccld ]]; then
             $add_rpaths && args=("-Wl,-rpath,$dep/lib64" "${args[@]}")
             args=("-L$dep/lib64" "${args[@]}")
-        elif [[ $mode = ld ]]; then
+        elif [[ $mode == ld ]]; then
             $add_rpaths && args=("-rpath" "$dep/lib64" "${args[@]}")
             args=("-L$dep/lib64" "${args[@]}")
         fi
@@ -212,9 +209,9 @@ for dep in "${deps[@]}"; do
 done
 
 # Include all -L's and prefix/whatever dirs in rpath
-if [[ $mode = ccld ]]; then
+if [[ $mode == ccld ]]; then
     $add_rpaths && args=("-Wl,-rpath,$SPACK_PREFIX/lib" "-Wl,-rpath,$SPACK_PREFIX/lib64" "${args[@]}")
-elif [[ $mode = ld ]]; then
+elif [[ $mode == ld ]]; then
     $add_rpaths && args=("-rpath" "$SPACK_PREFIX/lib" "-rpath" "$SPACK_PREFIX/lib64" "${args[@]}")
 fi
 
@@ -234,11 +231,14 @@ IFS=':' read -ra spack_env_dirs <<< "$SPACK_ENV_PATH"
 spack_env_dirs+=("" ".")
 PATH=""
 for dir in "${env_path[@]}"; do
-    remove=""
-    for rm_dir in "${spack_env_dirs[@]}"; do
-        if [[ $dir = $rm_dir ]]; then remove=True; fi
+    addpath=true
+    for env_dir in "${spack_env_dirs[@]}"; do
+        if [[ $dir == $env_dir ]]; then
+            addpath=false
+            break
+        fi
     done
-    if [[ -z $remove ]]; then
+    if $addpath; then
         PATH="${PATH:+$PATH:}$dir"
     fi
 done
@@ -247,7 +247,7 @@ export PATH
 full_command=("$command" "${args[@]}")
 
 # In test command mode, write out full command for Spack tests.
-if [[ $SPACK_TEST_COMMAND = dump-args ]]; then
+if [[ $SPACK_TEST_COMMAND == dump-args ]]; then
     echo "${full_command[@]}"
     exit
 elif [[ -n $SPACK_TEST_COMMAND ]]; then
@@ -257,7 +257,7 @@ fi
 #
 # Write the input and output commands to debug logs if it's asked for.
 #
-if [[ $SPACK_DEBUG = TRUE ]]; then
+if [[ $SPACK_DEBUG == TRUE ]]; then
     input_log="$SPACK_DEBUG_LOG_DIR/spack-cc-$SPACK_SHORT_SPEC.in.log"
     output_log="$SPACK_DEBUG_LOG_DIR/spack-cc-$SPACK_SHORT_SPEC.out.log"
     echo "[$mode] $command $input_command" >> $input_log