Node.js 使用shell和不使用shell运行进程之间有什么区别?

Node.js 使用shell和不使用shell运行进程之间有什么区别?,node.js,shell,child-process,Node.js,Shell,Child Process,在一次采访中,我遇到了这样一句话: 由于未生成shell,因此不支持I/O重定向和文件全局绑定等行为 很高兴知道,但是“如”让我担心还缺少哪些其他行为?甚至可以算作没有shell运行的行为-是不是sh/cmd.exe仍在解析命令行输入?看起来我最初的假设是有缺陷的:Bourne shell(sh)Windows的cmd.exe在没有外壳的情况下调用时也不会解析命令,这取决于使用的应用程序 最重要的丢失特性是缺少文件名扩展。除非被调用的应用程序二进制文件理解UNIX文件语法,否则无法执行大多数相对

在一次采访中,我遇到了这样一句话:

由于未生成shell,因此不支持I/O重定向和文件全局绑定等行为


很高兴知道,但是“如”让我担心还缺少哪些其他行为?甚至可以算作没有shell运行的行为-是不是
sh
/
cmd.exe
仍在解析命令行输入?

看起来我最初的假设是有缺陷的:Bourne shell(
sh
)Windows的
cmd.exe
在没有外壳的情况下调用时也不会解析命令,这取决于使用的应用程序

最重要的丢失特性是缺少文件名扩展。除非被调用的应用程序二进制文件理解UNIX文件语法,否则无法执行大多数相对文件路径技巧:

  • 没有父目录的
    。/
  • 当前工作目录没有
    /
  • 用户目录没有
    ~
不支持其他shell语法字符,如重定向运算符(
)和管道(
|


基本上,如果它被列为shell的wikipedia页面上的一项功能,那么非shell执行将不会有它。

请注意,目前编写的这个答案非常特定于Windows。在UNIX上,shell负责将字符串解析为命令行参数列表,并将其作为数组传递给消费应用程序(如
intmain(intargc,char**argv)
调用约定)。如果不提前生成数组,您甚至不能调用“消费应用程序”。此外,
受到操作系统系统调用(如
open()
)的尊重,因此没有shell也可以(在UNIX上;我无法与Windows对话)。只有
~
不是;与
/
相比,我几乎不认为这是“重要的”,请查看
execve
系统调用的手册页面,这是一个新程序在操作系统级别启动的方式——您会看到它将一个C字符串作为要调用的程序的文件名,一个C字符串数组用于参数列表传递该程序,和一个C字符串数组作为要传递的参数列表。像Node的
child\u进程
模块或Python的
子进程
模块这样的任何东西最终都在幕后实现该接口。如果缺少这个,我很乐意接受一个更好的答案——我正在努力解决这个问题。嗯。我可以为UNIX编写一个权威性的答案,但如果您希望在Windows上也能获得准确的答案,我无法提供。也就是说,我很确定对于一般问题(不是特定于node.js,而是针对一般情况,即Python的子流程模块中的
shell=True
,答案仍然适用)我们有重复项。没有缺少其他行为。有许多与子进程通信的方法不涉及shell的初始输入。端口、共享内存、IPC(进程间通信)等。。在这些情况下,不需要shell,父进程只需“分叉”子进程,在两个已经定义的进程之间进行所需的通信。