Skip to content

Commit 6e51337

Browse files
committed
feat(sys): Add an method sh to run shell cmd simply
Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
1 parent aea6857 commit 6e51337

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

examples/shell.lua

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/usr/bin/env eco
2+
3+
local sys = require 'eco.sys'
4+
5+
local stdout, stderr, err = sys.sh('date', '-u')
6+
print('stdout:', stdout)
7+
print('stderr:', stderr)
8+
9+
if err then
10+
print('err:', err)
11+
end
12+
13+
print('-----------------')
14+
15+
stdout, stderr, err = sys.sh('date -u >&2')
16+
print('stdout:', stdout)
17+
print('stderr:', stderr)
18+
19+
if err then
20+
print('err:', err)
21+
end
22+
23+
print('-----------------')
24+
25+
stdout, stderr, err = sys.sh('sleep 2', 1)
26+
print('stdout:', stdout)
27+
print('stderr:', stderr)
28+
29+
if err then
30+
print('err:', err)
31+
end

sys.lua

+34
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,40 @@ function M.exec(...)
5858
}, exec_metatable)
5959
end
6060

61+
-- stdout, stderr, err = sys.sh(cmd, timeout)
62+
function M.sh(cmd, timeout)
63+
assert(type(cmd) == 'string' or type(cmd) == 'table', 'cmd must be a string or table')
64+
65+
if type(cmd) == 'string' then
66+
cmd = { '/bin/sh', '-c', cmd }
67+
end
68+
69+
local p, err = M.exec(table.unpack(cmd))
70+
if not p then
71+
return nil, nil, err
72+
end
73+
74+
local stdout, stderr
75+
76+
timeout = timeout or 30
77+
78+
stdout, err = p:read_stdout('*a', timeout)
79+
if not stdout then
80+
p:close()
81+
return nil, nil, err
82+
end
83+
84+
stderr, err = p:read_stderr('*a', timeout)
85+
if not stderr then
86+
p:close()
87+
return stdout, nil, err
88+
end
89+
90+
p:close()
91+
92+
return stdout, stderr
93+
end
94+
6195
function M.signal(sig, cb, ...)
6296
local w = eco.watcher(eco.SIGNAL, sig)
6397

0 commit comments

Comments
 (0)