fix: preserve arguments with spaces (#4026)

The runtime environment launcher collapsed interpreter arguments into
one shell word. It now forwards each argument without reparsing it,
preserving the original argument boundaries.

This includes a regression test for interpreter arguments containing
spaces.

Related: https://github.com/bazelbuild/bazel/issues/30644
diff --git a/python/private/runtime_env_toolchain_interpreter.sh b/python/private/runtime_env_toolchain_interpreter.sh
index c78cfe1..57d9838 100755
--- a/python/private/runtime_env_toolchain_interpreter.sh
+++ b/python/private/runtime_env_toolchain_interpreter.sh
@@ -77,7 +77,7 @@
   # binary, not the actual one invoked.
   # NOTE: exec -a would be simpler, but isn't posix-compatible, and dash shell
   # (Ubuntu/debian default) doesn't support it; see #3009.
-  exec sh -c "$PYTHON_BIN \$@" "$venv_bin" "$@"
+  exec sh -c 'exec "$@"' "$venv_bin" "$PYTHON_BIN" "$@"
 else
   exec "$PYTHON_BIN" "$@"
 fi
diff --git a/tests/runtime_env_toolchain/BUILD.bazel b/tests/runtime_env_toolchain/BUILD.bazel
index f1bda25..42bd9cf 100644
--- a/tests/runtime_env_toolchain/BUILD.bazel
+++ b/tests/runtime_env_toolchain/BUILD.bazel
@@ -44,6 +44,7 @@
 py_reconfig_test(
     name = "bootstrap_script_test",
     srcs = ["toolchain_runs_test.py"],
+    args = ["'argument with spaces'"],
     bootstrap_impl = "script",
     data = [
         "//tests/support:current_build_settings",
diff --git a/tests/runtime_env_toolchain/toolchain_runs_test.py b/tests/runtime_env_toolchain/toolchain_runs_test.py
index f3dcee3..50c6878 100644
--- a/tests/runtime_env_toolchain/toolchain_runs_test.py
+++ b/tests/runtime_env_toolchain/toolchain_runs_test.py
@@ -25,6 +25,7 @@
             )
 
         if settings["bootstrap_impl"] == "script":
+            self.assertEqual(sys.argv[1:], ["argument with spaces"])
             # Verify we're running in a venv
             self.assertNotEqual(sys.prefix, sys.base_prefix)
             # .venv/ occurs for a build-time venv.
@@ -34,4 +35,4 @@
 
 
 if __name__ == "__main__":
-    unittest.main()
+    unittest.main(argv=sys.argv[:1])