【问题标题】:Can I access CLI programs from within Node's child_process?我可以从 Node 的 child_process 中访问 CLI 程序吗?
【发布时间】:2020-04-14 01:14:30
【问题描述】:

我编写了一个节点脚本,将 cd 依次放入多个目录并执行 bash 命令,以便将 repos 的内容部署到我的开发环境中。

本机 bash 命令可以正常工作,例如 cdls,但它看起来像由节点打开的子 shell 或子进程(或任何适当的术语,我不了解 Bash 的内部工作原理)没有任何可用于我的正常提示的内容。

例如

  • 全球可用的自定义 bash 工具集
  • nvm(这是否可能,在节点子外壳中运行不同版本的节点?)
  • gulp 中断,因为它没有安装必要的节点版本。

是否可以从节点子外壳访问这些程序/命令?我正在使用child_process 节点模块。

const { exec } = require('child_process');

function command (command) {
    exec (command, (err, stdout, stderr) => {
        if (err) {
            error(err);
        } else {
            message(`stdout: ${stdout}`);
            message(`stderr: ${stderr}`);
        }
    });
}

用于:

command('nvm use 6');
command('gulp build');
command('pde deploy');

【问题讨论】:

标签: node.js bash child-process


【解决方案1】:

子进程没有以bash 运行。 child_process 使用常规的sh shell 生成可执行文件。 如果您需要在bash 中运行命令,则您运行的命令行需要包裹在bash -c 中。例如:

command('bash -c "my command here"');

另外,你运行的每条命令都是一个子进程,它不影响父进程,也不影响任何后续的子进程。因此,像cd 这样的内置shell 只会更改该子进程的目录,而该目录会立即消失。如果你运行,你会看到这个:

command('cd /');
command('ls');

ls 命令将显示当前工作目录,而不是根目录。

如果您使用bash -c 运行命令,而$PATH 和其他环境变量仍未按您需要的方式设置,您需要调试您的shell 启动脚本。也许交互式 shell (.bash_profile) 和所有 shell (.bashrc) 之间存在差异。

请注意,完全非交互式的 shell 可能需要明确指定要运行的启动脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多