在Node.js中执行Shell命令会产生意外错误

时间:2020-02-26 12:42:21

标签: node.js sh

我正在尝试从nodejs(在Linux中)执行以下命令

const exec = require('child_process').exec;
exec('cd "/tmp/export/lessons/4/content/RES-52298196-ce0f-4d91-8aa5-53f4f8e4ecb9/ui" && rm -r !("M345")', (err) => console.log(err));

但是我得到以下输出

Error: Command failed: cd "/tmp/export/lessons/4/content/RES-52298196-ce0f-4d91-8aa5-53f4f8e4ecb9/ui" && rm -r !("M345")
/bin/sh: -c: riga 0: errore di sintassi vicino al token non atteso "("
/bin/sh: -c: riga 0: `cd "/tmp/export/lessons/4/content/RES-52298196-ce0f-4d91-8aa5-53f4f8e4ecb9/ui" && rm -r !("M345")'
    at ChildProcess.exithandler (child_process.js:303:12)
    at ChildProcess.emit (events.js:321:20)
    at ChildProcess.EventEmitter.emit (domain.js:485:12)
    at maybeClose (internal/child_process.js:1026:16)
    at Socket.<anonymous> (internal/child_process.js:441:11)
    at Socket.emit (events.js:321:20)
    at Socket.EventEmitter.emit (domain.js:485:12)
    at Pipe.<anonymous> (net.js:672:12) {
  killed: false,
  code: 1,
  signal: null,
  cmd: 'cd "/tmp/export/lessons/4/content/RES-52298196-ce0f-4d91-8aa5-53f4f8e4ecb9/ui" && rm -r !("M345")'
}

但是,如果我尝试直接从终端这样运行相同的shell命令

$ cd "/tmp/export/lessons/4/content/RES-52298196-ce0f-4d91-8aa5-53f4f8e4ecb9/ui" && rm -r !("M345")

它按预期工作正常。我在哪里做错了?

2 个答案:

答案 0 :(得分:0)

尝试像child_process.exec一样将shell选项传递给{ "shell": "/bin/bash" }

答案 1 :(得分:0)

我通过使用find命令而不是rm来解决,就像这样:

var ui = "folder_i_want_to_save";
var myPath = "/path/to/base/directory";
var cmd = `find . -type d ! -name . ! -name '${ui}' -exec rm -rv {} +`;
exec(cmd, { cwd: myPath }, (err) => console.log(err));

我还删除了命令的cd部分,并将其作为cwd参数传递。 不幸的是,这是一种解决方法,而不是对语法错误的真正解决方案。

相关问题