exec-sh.js
2.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
var cp = require('child_process')
var defSpawnOptions = { stdio: 'inherit' }
/**
* @summary Get shell program meta for current platform
* @private
* @returns {Object}
*/
function getShell () {
if (process.platform === 'win32') {
return { cmd: 'cmd', arg: '/C' }
} else {
return { cmd: 'sh', arg: '-c' }
}
}
/**
* Callback is called with the output when the process terminates. Output is
* available when true is passed as options argument or stdio: null set
* within given options.
*
* @summary Execute shell command forwarding all stdio
* @param {String|Array} command
* @param {Object|TRUE} [options] spawn() options or TRUE to set stdio: null
* @param {Function} [callback]
* @returns {ChildProcess}
*/
function execSh (command, options, callback) {
if (Array.isArray(command)) {
command = command.join(';')
}
if (options === true) {
options = { stdio: null }
}
if (typeof options === 'function') {
callback = options
options = defSpawnOptions
} else {
options = options || {}
options = Object.assign({}, defSpawnOptions, options)
callback = callback || function () {}
}
var child
var stdout = ''
var stderr = ''
var shell = getShell()
try {
child = cp.spawn(shell.cmd, [shell.arg, command], options)
} catch (e) {
callback(e, stdout, stderr)
return
}
if (child.stdout) {
child.stdout.on('data', function (data) {
stdout += data
})
}
if (child.stderr) {
child.stderr.on('data', function (data) {
stderr += data
})
}
child.on('close', function (code) {
if (code) {
var e = new Error('Shell command exit with non zero code: ' + code)
e.code = code
callback(e, stdout, stderr)
} else {
callback(null, stdout, stderr)
}
})
return child
}
execSh.promise = function (command, options) {
return new Promise(function (resolve, reject) {
execSh(command, options, function (err, stdout, stderr) {
if (err) {
err.stdout = stdout
err.stderr = stderr
return reject(err)
}
resolve({
stderr: stderr,
stdout: stdout
})
})
})
}
module.exports = execSh