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