在 nodejs 中执行 shell 命令会出现意外错误

Executing shell command in nodejs gives unexpected error

我正在尝试从 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")

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

尝试将 shell 选项传递给 child_process.exec,例如 { "shell": "/bin/bash" }

我通过使用 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 参数传递。 不幸的是,这是一种解决方法,而不是语法错误的真正解决方案。