Some random NodeJS helper functions for shell execution
npm install xsh --save-dev
xsh >= 1.0.0 is an ES module written in TypeScript, requiring node >= 22.18.
import xsh from "xsh";
xsh.exec("echo hello");
CJS consumers can still require it (node >= 22.18 require(esm)):
const xsh = require("xsh");
xsh.exec("echo hello");
See the full API reference for every function, option, and type.
PromiseYou can set a custom Promise with:
import AveAzul from "aveazul";
xsh.Promise = AveAzul;
Or set to the native Promise with:
xsh.Promise = null;
xsh.mkCmd(["echo", "hello"]);
xsh.mkCmd("echo", "hello");
Both return the string "echo hello".
xsh.exec(shellCommand, [options], [callback] );
Execute shellCommand asynchronously with Node.js
child_process.exec.
xsh.exec adds flexible command fragments, a callback/error shape, and a thenable result that
also exposes the child process and its output streams.
shellCommand - can be combination of multiple strings and arrays. Array is joined with " " into strings. All final strings are joined with " ".
options - optional options
true or false, it sets silent flag for output to console.silent and any option accepted by
Node.js exec.maxBuffer defaults to 20 MiB.callback - optional, if provided, it will be called as follows:
callback( code !== 0 ? new Error("...") : undefined, { stdout, stderr } )
error.output is set to { stdout, stderr}.
error.code is set to code.
With callback - The child object returned by exec
Without callback - An object with following:
{
then, catch, promise, child, stdout, stderr
}
Where:
then - a wrapper function for calling the promise.thencatch - a wrapper function for calling the promise.catchpromise - rejects with the error or resolves with { stdout, stderr }child - the child from execstdout and stderr - alias to child.stdout and child.stderrxsh.exec("echo hello").then(r => { console.log("result", r.stdout); });
options:xsh.exec("pwd", {cwd: "/tmp"}).then(r => { console.log("result", r.stdout)})
xsh.exec("echo hello", (r) => {console.log("result", r.stdout)})
shellCommand as a combination of strings and array of strings:xsh.exec("echo", ["hello", "world"], {silent: false})
Would run shell command: echo hello world
xsh.envPath.addToFront(path, [env]);
Add path to the front of process.env.PATH. If it already exists, then it is moved to the front.
If you don't want to operate on process.env you can pass in a second argument that's either an object or a string that's the path to change.
xsh.envPath.addToEnd(path, [env]);
Add path to the end of process.env.PATH. If it already exists, then it is moved to the end.
If you don't want to operate on process.env you can pass in a second argument that's either an object or a string that's the path to change.
xsh.envPath.add(path, [env]);
If path doesn't exist in process.env.PATH then it's added to the end.
If you don't want to operate on process.env you can pass in a second argument that's either an object or a string that's the path to change.
xsh.pushd(dir);
// ...
xsh.popd();
pushd saves process.cwd() on a stack, then chdirs into dir, returning the new cwd.
popd chdirs back to the directory most recently saved by pushd, returning it. popd
throws if the stack is empty.