Home > Software engineering >  nodejs: valid command line prompt doesn't exec or spawn with ENOENT error
nodejs: valid command line prompt doesn't exec or spawn with ENOENT error

Time:09-29

I have a bash command (debian 10, GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)):

documents=("/data/sice.pdf" "/das00/12ser.pdf");bash ./clean-pdfs.sh "${documents[*]}"

that works when I paste into terminal.

However invoking it with either exec or spawn fails without giving clear error message.

When I ran it with exec I got some complaints about the brackets. Remembering the output is quite large, I opted for 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);
});

and after running this nodejs script I get the following error message that isn't very helpful (i changed the paths for security reasons):

{ 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 one rrorNT (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: [] }

CodePudding user response:

The option shell is required here to (both conditions apply):

  • parse multiple commands separated by ";"
  • run commands that are not executable, like assigning an environment variable with document=.

To have the output of the spawned process printed to the console, we can use the option stdio: 'inherit'.

Both settings are documented here: https://nodejs.org/api/child_process.html#child_processspawncommand-args-options

And here is my version of the code that I was able to test succesfully on a zsh terminal. I'm using spawnSync because it's easier to handle without a callback, but spawn works just as well.

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' })
  • Related