diff --git a/bin/sbang b/bin/sbang
index f6b6d35e8ad9f9cc3f9b07cc49879168b72a328d..1ea5f06592a0a344824d1b1f820bc390b1b5ea48 100755
--- a/bin/sbang
+++ b/bin/sbang
@@ -79,6 +79,15 @@
 # Obviously, for this to work, `sbang` needs to have a short enough
 # path that *it* will run without hitting OS limits.
 #
+# For Lua, scripts the second line can't start with #!, as # is not
+# the comment character in lua (even though lua ignores #! on the
+# *first* line of a script).  So, instrument a lua script like this,
+# using -- instead of # on the second line:
+#
+#     1    #!/bin/bash /path/to/sbang
+#     2    --!/long/path/to/lua with arguments
+#     3
+#     4    print "success!"
 #
 # How it works
 # -----------------------------
@@ -95,6 +104,8 @@ lines=0
 while read line && ((lines < 2)) ; do
     if [[ "$line" = '#!'* ]]; then
         interpreter="${line#\#!}"
+    elif [[ "$line" = '--!'*lua* ]]; then
+        interpreter="${line#--!}"
     fi
     lines=$((lines+1))
 done < "$script"
diff --git a/lib/spack/spack/hooks/sbang.py b/lib/spack/spack/hooks/sbang.py
index cb0ad42b144d76067d7a9f73a2f7a73b7738ce10..3a957c6e0e258f9628c6110592f6ee5551cbfb6c 100644
--- a/lib/spack/spack/hooks/sbang.py
+++ b/lib/spack/spack/hooks/sbang.py
@@ -23,6 +23,7 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 ##############################################################################
 import os
+import re
 
 import llnl.util.tty as tty
 
@@ -57,11 +58,15 @@ def filter_shebang(path):
     if original.startswith(new_sbang_line):
         return
 
+    # Use --! instead of #! on second line for lua.
+    if re.search(r'^#!(/[^/]*)*lua\b', original):
+        original = re.sub(r'^#', '--', original)
+
     with open(path, 'w') as new_file:
         new_file.write(new_sbang_line)
         new_file.write(original)
 
-    tty.warn("Patched overly long shebang in %s" % path)
+    tty.warn("Patched overlong shebang in %s" % path)
 
 
 def filter_shebangs_in_directory(directory):
diff --git a/lib/spack/spack/test/sbang.py b/lib/spack/spack/test/sbang.py
index 6aea1a68c77446f4e3ce42418b8157ea5dda2e9a..ed54ff90b00ecba417050d4d2e3b2903ec755448 100644
--- a/lib/spack/spack/test/sbang.py
+++ b/lib/spack/spack/test/sbang.py
@@ -34,10 +34,12 @@
 from spack.hooks.sbang import filter_shebangs_in_directory
 import spack
 
-short_line = "#!/this/is/short/bin/bash\n"
-long_line  = "#!/this/" + ('x' * 200) + "/is/long\n"
-sbang_line = '#!/bin/bash %s/bin/sbang\n' % spack.spack_root
-last_line = "last!\n"
+short_line       = "#!/this/is/short/bin/bash\n"
+long_line        = "#!/this/" + ('x' * 200) + "/is/long\n"
+lua_line         = "#!/this/" + ('x' * 200) + "/is/lua\n"
+lua_line_patched = "--!/this/" + ('x' * 200) + "/is/lua\n"
+sbang_line       = '#!/bin/bash %s/bin/sbang\n' % spack.spack_root
+last_line        = "last!\n"
 
 class SbangTest(unittest.TestCase):
     def setUp(self):
@@ -59,6 +61,12 @@ def setUp(self):
             f.write(long_line)
             f.write(last_line)
 
+        # Lua script with long shebang
+        self.lua_shebang = os.path.join(self.tempdir, 'lua')
+        with open(self.lua_shebang, 'w') as f:
+            f.write(lua_line)
+            f.write(last_line)
+
         # Script already using sbang.
         self.has_shebang = os.path.join(self.tempdir, 'shebang')
         with open(self.has_shebang, 'w') as f:
@@ -71,7 +79,6 @@ def tearDown(self):
          shutil.rmtree(self.tempdir, ignore_errors=True)
 
 
-
     def test_shebang_handling(self):
         filter_shebangs_in_directory(self.tempdir)
 
@@ -86,6 +93,12 @@ def test_shebang_handling(self):
             self.assertEqual(f.readline(), long_line)
             self.assertEqual(f.readline(), last_line)
 
+        # Make sure this got patched.
+        with open(self.lua_shebang, 'r') as f:
+            self.assertEqual(f.readline(), sbang_line)
+            self.assertEqual(f.readline(), lua_line_patched)
+            self.assertEqual(f.readline(), last_line)
+
         # Make sure this is untouched
         with open(self.has_shebang, 'r') as f:
             self.assertEqual(f.readline(), sbang_line)