If you ever wanted to run some automation script or file in your Unix/Linux machine using nodejs?It may be to build your binaries from source code or for some tooling in your dev workflow. Nodejs Provides well-matured APIs for doing these operations and there are plenty of npm modules to ease the pain creating shell or terminal based cli’s using nodejs. We will explore both options one by one.

Run Shell or bash command using Nodejs

We will be using Node.js inbuilt module child_process for doing this operation.

For buffered, non-stream formatted output:

const { exec } = require('child_process');
exec('ls | grep js', (err, stdout, stderr) => {
  if (err) {
    //some err occurred
  } else {
   // the *entire* stdout and stderr (buffered)
   console.log(`stdout: ${stdout}`);
   console.log(`stderr: ${stderr}`);

If you want to use promises,

const util = require('util');
const exec = util.promisify(require('child_process').exec);
async function lsWithGrep() {
  try {
      const { stdout, stderr } = await exec('ls | grep js');
      console.log('stdout:', stdout);
      console.log('stderr:', stderr);
  }catch (err)=>{

If you want to use output stream,

const { spawn } = require('child_process');
const child = spawn('ls', );
// use child.stdout.setEncoding('utf8'); if you want text chunks
child.stdout.on('data', (chunk) => {
  // data from the standard output is here as buffers
// since these are streams, you can pipe them elsewhere
child.on('close', (code) => {
  console.log(`child process exited with code ${code}`);

if you want to execute shell script synchronously,

Then check out following APIs:

const { execSync } = require('child_process');
// stderr is sent to stdout of parent process
// you can set options.stdio if you want it to go elsewhere
const stdout = execSync('ls');
const { spawnSync} = require('child_process');
const child = spawnSync('ls', );
console.error('error', child.error);
console.log('stdout ', child.stdout);
console.error('stderr ', child.stderr);

Run Shell or bash file using Nodejs

if you want to execute whole shell script file, instead of commands, Then see the following code,
You can use any of the above methods to achieve this functionality.

const exec = require('child_process').exec, child;
const myShellScript = exec('sh doSomething.sh /myDir');
myShellScript.stdout.on('data', (data)=>{
    // do whatever you want here with data
myShellScript.stderr.on('data', (data)=>{

Nodejs Documentation for this can found here.

you can use child_process.execFile method also to executing file.

If you want to use, third-party npm modules, then check out:

You can find many more in npmjs.com

Now you can do some scripting Node.js. Happy scripting. These Methods come pretty handily when you’re building custom dev workflow or you want to do some automation when in the workflow.

This article first appeared on stackfame.com programming blog.