在vscode的tasks.json中,进程(process)和shell有什么区别?

32
Visual Studio Code 中的任务中的 自定义任务 部分描述了任务的属性。其中有一个 type 属性来定义任务的类型:

type:任务的类型。对于自定义任务,可以是 shellprocess。如果指定为 shell,则命令会被解释为 shell 命令(例如: bash、cmd 或 PowerShell)。如果指定为 process,则命令会被解释为要执行的进程。

我不明白它们之间的区别是什么。无论我选择 shell 还是 process,所有的执行结果都是相同的。

那么,被解释为 shell 命令被解释为要执行的进程 到底意味着什么区别?

3个回答

30

Shell命令只能在shell中运行,例如cmdDIRbashif。因此,当您想要运行shell命令时,必须使用"type": "shell"设置以正确运行它。当您想要运行一个程序,如.bat.sh.exe时,只需使用"type": "process"设置即可。


1
你是一个真正的英雄。 - Aminadav Glickshtein
2
那并没有真正回答什么是赞成和反对的论点。 - Razze
1
我建议稍微改一下措辞。具体来说,“当您想要运行诸如.bat、.sh或.exe等程序时,…”与“当您想要运行shell命令”相混淆,因为.BAT和.SH不是程序,而是可能包含shell命令和语句的shell脚本。因此,如果您想启动可执行文件并将参数传递给它,可以安全地使用“process”。如果您传递像上面提到的shell脚本或特定于shell的命令,请使用“shell”。 - Petr Lazecky
4
我同意 @Razze 的观点,正反方论据仍未得到解答。在执行程序时,使用“进程”类型相比使用“shell”类型调用该程序有何好处?他们提供“进程”类型肯定有原因,但它是什么?通过切换到“进程”类型来运行单个程序命令,我能获得什么好处?我在文档中找不到答案。 - plwalsh88
2
@WillHuang,是的。如果我想在命令中使用除程序名称以外的任何其他逻辑,我需要使用“shell”类型。但是,我仍然可以只使用“shell”类型作为程序名称,据我所知,结果将与使用“process”类型相同。所以这仍然没有回答“为什么我应该选择'process'类型?”的问题。 - plwalsh88
显示剩余4条评论

3

最近我遇到了一个问题,最终通过将类型从 "process" 更改为 "shell" 顺利解决了。我认为这可能对你有所帮助:我尝试运行多个 .cpp 文件,并在 args 中使用通配符 "${fileDirname}/.cpp"。当类型为 process 时,无法成功运行项目,因为它总是告诉我:"*.cpp":no such file or directory。而当我更改为 "shell" 后,则一切顺利。这可能是 "process" 和 "shell" 之间的差异之一。


3

我认为两者的区别如下:

  • process:运行特定的程序(二进制文件)
  • shell:启动一个 shell 会话并在该 shell 会话中运行给定的命令

如果您向 shell 给出的命令只是(路径)一个程序,例如 date,则结果将完全相同。

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "example1",
      "type": "process",
      "command": "date",
      "presentation": {
        "reveal": "always"
      },
      "problemMatcher": []
    },
    {
      "label": "example2",
      "type": "shell",
      "command": "date",
      "presentation": {
        "reveal": "always"
      },
      "problemMatcher": []
    }
  ]
}

使用process的任务可能会更快,因为它不会启动一个shell会话。
但是,由于shell类型的任务创建了一个shell会话,因此它可以使用您可以在命令行上输入的任何命令。假设我们要运行的任务是date -u +"%Y-%m-%dT%H:%M:%SZ",我们可以使用shell任务来完成,但不能使用process任务。
示例:
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "example1",
      "type": "process",
      "command": "date",
      "presentation": {
        "reveal": "always"
      },
      "problemMatcher": []
    },
    {
      "label": "example2",
      "type": "shell",
      "command": "date -u +\"%Y-%m-%dT%H:%M:%SZ\"",
      "presentation": {
        "reveal": "always"
      },
      "problemMatcher": []
    }
  ]
}

所以,像往常一样,这取决于你需要或想要什么。个人认为,shell 类型的任务更加有用。
另外一个事情:任务定义也可以有一个 "args" 键,您可以在其中发送参数。如果您需要使用进程,则可能允许您发送参数。我没有调查这个问题来回答这个问题。 另一个相关的文档页面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接