Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在nodejs中执行顺序基本命令?_Javascript_Node.js_Npm_Npm Scripts - Fatal编程技术网

Javascript 如何在nodejs中执行顺序基本命令?

Javascript 如何在nodejs中执行顺序基本命令?,javascript,node.js,npm,npm-scripts,Javascript,Node.js,Npm,Npm Scripts,我需要在nodejs中按顺序运行4个bash命令 set +o history sed -i 's/&& !this.peekStartsWith('\/\/')/ /g' dist/vendor.bundle.js sed -i 's/&& !this.peekStartsWith('\/\/')/ /g' dist/vendor.bundle.js.map set -o history 如何做到这一点?或者是否可以添加npm脚本?要从节点运行shell命令

我需要在nodejs中按顺序运行4个bash命令

set +o history
sed -i 's/&& !this.peekStartsWith('\/\/')/ /g' dist/vendor.bundle.js
sed -i 's/&& !this.peekStartsWith('\/\/')/ /g' dist/vendor.bundle.js.map
set -o history


如何做到这一点?或者是否可以添加npm脚本?

要从节点运行shell命令,请使用
exec

三种可能的方法是

  • 创建一个包含所有必需命令的bash脚本文件,然后使用
    exec
    从节点运行它

  • 使用
    exec
    从节点分别运行每个命令

  • 使用一个npm包,例如下面的一个(我还没有试过)

  • 也可以使用
    promisify
    exec
    ()并使用
    async/await
    而不是回调。 比如说,

    const {promisify} = require('util');
    const {exec} = require('child_process');
    
    const execAsync = promisify(exec);
    
    (async () => {
      const {stdout, stderr} = await execAsync('set +o history');
    ...
    })();
    
    

    要扩展@melc的答案,并按顺序执行请求,您可以执行以下操作:

    const {promisify} = require('util');
    const {exec} = require('child_process');
    const execAsync = promisify(exec);
    
    const sequentialExecution = async (...commands) => {
      if (commands.length === 0) {
        return 0;
      }
    
      const {stderr} = await execAsync(commands.shift());
      if (stderr) {
        throw stderr;
      }
    
      return sequentialExecution(...commands);
    }
    
    // Will execute the commands in series
    sequentialExecution(
      "set +o history",
      "sed -i 's/&& !this.peekStartsWith('\/\/')/ /g' dist/vendor.bundle.js",
      "sed -i 's/&& !this.peekStartsWith('\/\/')/ /g' dist/vendor.bundle.js.map",
      "set -o history",
    );
    
    或者,如果您不关心stdout/sterr,则可以使用以下一个衬里:

    const commands = [
      "set +o history",
      "sed -i 's/&& !this.peekStartsWith('\/\/')/ /g' dist/vendor.bundle.js",
      "sed -i 's/&& !this.peekStartsWith('\/\/')/ /g' dist/vendor.bundle.js.map",
      "set -o history",
    ];
    
    await commands.reduce((p, c) => p.then(() => execAsync(c)), Promise.resolve());
    

    您可以运行包含这些命令的shell脚本,也可以在nodejs程序中单独运行它们。请参阅.What does+o do?@slebetman以执行具有特殊字符的SED命令
    set+o history
    required To set。