【问题标题】:What are the differences between running a process with and without a shell?使用和不使用 shell 运行进程有什么区别?
【发布时间】:2018-09-09 03:11:47
【问题描述】:

Node.js docs for child_process,我遇到了这样一行:

由于没有生成 shell,因此不支持 I/O 重定向和文件通配等行为。

很高兴知道,但“例如”让我担心。 还遗漏了哪些其他行为? 甚至在没有 shell 的情况下运行也算得上——sh/cmd.exe 不是还在解析命令行输入吗?

【问题讨论】:

  • 没有其他行为缺失。有许多与子进程通信的方法不涉及来自 shell 的初始输入。端口、共享内存、IPC(进程间通信)等。在这些情况下,不需要 shell,父进程只需“分叉”出一个子进程,而这两个进程之间已经定义了所需的任何通信.

标签: node.js shell child-process


【解决方案1】:

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

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

  • 父目录没有../
  • 当前工作目录没有./
  • 用户目录没有~

不支持其他 shell 语法字符,例如重定向运算符(例如>)和管道(|)。

基本上,如果它被列为 shell 的维基百科页面上的一项功能,非 shell 执行将没有它。

【讨论】:

  • 请注意,目前编写的此答案非常特定于 Windows。在 UNIX 上,shell 负责将字符串解析为命令行参数列表,该列表作为数组传递给消费应用程序(如 int main(int argc, char**argv) 调用约定中一样)。如果不提前生成该数组,您甚至无法调用“消费应用程序”
  • 另外,... 受到操作系统系统调用的尊重(如 open()),因此没有外壳也可以(在 UNIX 上;我无法与 Windows 对话) .只有~ 不是;与>/<&&|| 等复合命令运算符相比,我几乎不会称其为“重要”。
  • 查看execve 系统调用的手册页,这是在操作系统级别启动新程序的方式——您会看到它采用单个 C 字符串作为程序的文件名调用,一个用于传递该程序的参数列表的 C 字符串数组,以及一个作为要传递的参数列表的 C 字符串数组。像 Node 的 child_process 模块或 Python 的 subprocess 模块这样的东西最终都会在底层实现该接口。
  • 如果缺少这个答案,我很乐意接受更好的答案——我正在努力解决这个问题。
  • 嗯。我可以为 UNIX 写一个权威的答案,但是如果你想要在 Windows 上也准确的东西,我无法提供它。也就是说,我很确定我们对一般问题有重复项(不是特定于 node.js,而是针对一般情况,即 Python 的子进程模块中的 shell=True - 答案仍然适用)。跨度>
猜你喜欢
  • 2012-04-12
  • 2023-03-05
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-29
  • 2012-12-03
相关资源
最近更新 更多