我有一个bash命令(debian 10,GNU bash,版本5.0.3(1(-发行版(x86_64-pc-linux-GNU((:
documents=("/data/sice.pdf" "/das00/12ser.pdf");bash ./clean-pdfs.sh "${documents[*]}"
当我粘贴到终端时,它就起作用了。
然而,使用exec或spawn调用它失败,并且没有给出明确的错误消息。
当我用exec
运行它时,我收到了一些关于括号的抱怨。记住输出相当大,我选择了spawn
const { exec } = require('child_process');
command = `documents=(${pdfPaths});` + 'bash ./clean-pdfs.sh "${documents[*]}"'
console.log(command);
const subProcess = require('child_process')
const lsChildProcess = subProcess.spawn(command)
lsChildProcess.stdout.on('data', (data) => {
console.log(data);
})
lsChildProcess.on('error', function(err) {
console.log(err);
});
在运行这个nodejs脚本后,我得到了以下错误消息,但没有太大帮助(出于安全原因,我更改了路径(:
{ Error: spawn documents=("/data/Traa.pdf" "/dater.pdf");bash ./clean-pdfs.sh "${documents[*]}" ENOENT
at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
at onErrorNT (internal/child_process.js:415:16)
at process._tickCallback (internal/process/next_tick.js:63:19)
errno: 'ENOENT',
code: 'ENOENT',
syscall:
'spawn documents=("/daice.pdf" "/daer.pdf");bash ./clean-pdfs.sh "${documents[*]}"',
path:
'documents=("/dace.pdf" "/daer.pdf");bash ./clean-pdfs.sh "${documents[*]}"',
spawnargs: [] }
此处需要选项shell
(两个条件都适用(:
- 解析多个由"分隔的命令">
- 运行不可执行的命令,例如使用
document=
分配环境变量
要将派生进程的输出打印到控制台,我们可以使用选项stdio: 'inherit'
。
这两种设置都记录在此处:https://nodejs.org/api/child_process.html#child_processspawncommand-args选项
这是我在zsh终端上成功测试的代码版本。我使用spawnSync
是因为它在没有回调的情况下更容易处理,但spawn
也同样有效。
const pdfPaths = '"/data/sice.pdf" "/das00/12ser.pdf"';
command = `documents=(${pdfPaths});` + 'bash ./clean-pdfs.sh "${documents[*]}"'
console.log(command);
const subProcess = require('child_process')
subProcess.spawnSync(command, { shell: true, stdio: 'inherit' })