128 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			128 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|  | # exec-sh
 | ||
|  | 
 | ||
|  | [](https://nodei.co/npm/exec-sh/) | ||
|  | 
 | ||
|  | [](https://www.npmjs.com/package/exec-sh) | ||
|  | [](https://travis-ci.org/tsertkov/exec-sh) | ||
|  | [](https://coveralls.io/r/tsertkov/exec-sh?branch=master) | ||
|  | [](https://david-dm.org/tsertkov/exec-sh) | ||
|  | 
 | ||
|  | > Execute shell command forwarding all stdio streams.
 | ||
|  | 
 | ||
|  | ## Features
 | ||
|  | 
 | ||
|  | exec-sh is a wrapper for [`child_process.spawn`](http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options) with some improvements: | ||
|  | 
 | ||
|  | - Cross platform command execution: | ||
|  |   - Windows: `cmd /C COMMAND` | ||
|  |   - others: `sh -c COMMAND` | ||
|  | - Fowrards all stdio streams to current terminal (by default): | ||
|  |   - `execSh("bash")` | ||
|  |   - `execsh("echo -n Say: && read i && echo Said:$i")` | ||
|  | - stdout and stderr are passed to callback when available | ||
|  |   - `execSh("pwd", console.log)` | ||
|  | 
 | ||
|  | ## Showcase
 | ||
|  | ```javascript | ||
|  | // JavaScript | ||
|  | 
 | ||
|  | execSh("echo hello exec-sh && bash", { cwd: "/home" }, function(err){ | ||
|  |   if (err) { | ||
|  |     console.log("Exit code: ", err.code); | ||
|  |   } | ||
|  | }); | ||
|  | ``` | ||
|  | 
 | ||
|  | ```sh | ||
|  | # Terminal output: interactive bash session
 | ||
|  | 
 | ||
|  | hello exec-sh | ||
|  | bash-3.2$ pwd | ||
|  | /home | ||
|  | bash-3.2$ exit 99 | ||
|  | exit | ||
|  | Exit code:  99 | ||
|  | ``` | ||
|  | 
 | ||
|  | ## Usage
 | ||
|  | 
 | ||
|  | ```javascript | ||
|  | var execSh = require("../"); | ||
|  | 
 | ||
|  | // run interactive bash shell | ||
|  | execSh("echo lorem && bash", { cwd: "/home" }, function(err){ | ||
|  |   if (err) { | ||
|  |     console.log("Exit code: ", err.code); | ||
|  |     return; | ||
|  |   } | ||
|  | 
 | ||
|  |   // collect streams output | ||
|  |   var child = execSh(["bash -c id", "echo lorem >&2"], true, | ||
|  |     function(err, stdout, stderr){ | ||
|  |       console.log("error: ", err); | ||
|  |       console.log("stdout: ", stdout); | ||
|  |       console.log("stderr: ", stderr); | ||
|  |     }); | ||
|  | }); | ||
|  | ``` | ||
|  | 
 | ||
|  | ## Promise Interface
 | ||
|  | 
 | ||
|  | ```javascript | ||
|  | var execShPromise = require("exec-sh").promise; | ||
|  | 
 | ||
|  | // run interactive bash shell | ||
|  | const run = async () => { | ||
|  |   let out; | ||
|  |    | ||
|  |   try { | ||
|  |     out = await execShPromise('pwd', true); | ||
|  |   } catch (e) { | ||
|  |     console.log('Error: ', e); | ||
|  |     console.log('Stderr: ', e.stderr); | ||
|  |     console.log('Stdout: ', e.stdout); | ||
|  |      | ||
|  |     return e; | ||
|  |   } | ||
|  |    | ||
|  |   console.log('out: ', out.stdout, out.stderr); | ||
|  | } | ||
|  | 
 | ||
|  | run(); | ||
|  | ``` | ||
|  | 
 | ||
|  | ## Public API
 | ||
|  | 
 | ||
|  | ### `execSh(command, [options], [callback])`
 | ||
|  | 
 | ||
|  | Execute shell command forwarding all stdio. | ||
|  | 
 | ||
|  | **Parameters:** | ||
|  | 
 | ||
|  | - `command {String|Array}` - The command to run, or array of commands | ||
|  | - `[options] {Object|TRUE}` - Options object passed directly to [`child_process.spawn`](http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options), when `TRUE` then `{ stdio: null }` used | ||
|  | - `[callback] {Function}` - `callback(err, stdout, stderr)` | ||
|  |  - `err {Error|NULL}` - Error object. Has `code` property containing last command exit code when available | ||
|  |  - `stdout {String|NULL}` - aggregated stdout or `NULL` if not available | ||
|  |  - `stderr {String|NULL}` - aggregated stderr or `NULL` if not available | ||
|  | 
 | ||
|  | **Return Values:** | ||
|  | 
 | ||
|  | Returns [ChildProcess](http://nodejs.org/api/child_process.html#child_process_class_childprocess) object. | ||
|  | 
 | ||
|  | ## Private API
 | ||
|  | Complete API Documentation including private and public methods is generated from source code by JSDoc tool and is [available here](https://s3.eu-central-1.amazonaws.com/tsertkov-artifacts/exec-sh/master/jsdoc/index.html). | ||
|  | 
 | ||
|  | ## Code Coverage
 | ||
|  | Code coverage report for all files is [available here](https://s3.eu-central-1.amazonaws.com/tsertkov-artifacts/exec-sh/master/coverage/lcov-report/index.html). | ||
|  | 
 | ||
|  | ## Scripts
 | ||
|  | 
 | ||
|  | - `npm test` - run tests | ||
|  | - `npm run jsdoc` - build jsdoc | ||
|  | - `npm run dev` - run tests continuously | ||
|  | 
 | ||
|  | ## License
 | ||
|  | 
 | ||
|  | The MIT License (MIT) |