瀏覽代碼

HackStudio: Do not spawn an intermediary shell

The Shell also puts each command into its own process group,
which interferes with us trying to do the same here. We don't
really need the shell here anyway, but it means we'll have to
do command splitting ourselves.
Sergey Bugaev 5 年之前
父節點
當前提交
1f5001c581
共有 1 個文件被更改,包括 10 次插入6 次删除
  1. 10 6
      DevTools/HackStudio/TerminalWrapper.cpp

+ 10 - 6
DevTools/HackStudio/TerminalWrapper.cpp

@@ -103,13 +103,17 @@ void TerminalWrapper::run_command(const String& command)
             perror("ioctl(TIOCSCTTY)");
             perror("ioctl(TIOCSCTTY)");
             exit(1);
             exit(1);
         }
         }
-        const char* args[4] = { "/bin/Shell", nullptr, nullptr, nullptr };
-        if (!command.is_empty()) {
-            args[1] = "-c";
-            args[2] = command.characters();
+
+        setenv("TERM", "xterm", true);
+        setenv("PATH", "/bin:/usr/bin:/usr/local/bin", true);
+
+        auto parts = command.split(' ');
+        ASSERT(!parts.is_empty());
+        const char** args = (const char**) calloc(parts.size() + 1, sizeof(const char*));
+        for (int i = 0; i < parts.size(); i++) {
+            args[i] = parts[i].characters();
         }
         }
-        const char* envs[] = { "TERM=xterm", "PATH=/bin:/usr/bin:/usr/local/bin", nullptr };
-        rc = execve("/bin/Shell", const_cast<char**>(args), const_cast<char**>(envs));
+        rc = execvp(args[0], const_cast<char**>(args));
         if (rc < 0) {
         if (rc < 0) {
             perror("execve");
             perror("execve");
             exit(1);
             exit(1);