1 ## our_shell: ysh
2 ## oils_failures_allowed: 0
3
4 #### captureStdout() is like $()
5
6 proc p {
7 var captured = 'captured'
8 var cmd = ^(echo one; echo $captured)
9
10 var stdout = io.captureStdout(cmd)
11 pp test_ (stdout)
12 }
13
14 p
15
16 ## STDOUT:
17 (Str) "one\ncaptured"
18 ## END
19
20 #### captureStdout() failure
21
22 var c = ^(echo one; false; echo two)
23
24 # Hm this prints a message, but no stack trace
25 # Should make it fail I think
26
27 try {
28 var x = io.captureStdout(c)
29 }
30 # This has {"code": 3} because it's an expression error. Should probably
31 pp test_ (_error)
32
33 var x = io.captureStdout(c)
34
35 ## status: 4
36 ## STDOUT:
37 (Dict) {"status":1,"code":4,"message":"captureStdout(): command failed with status 1"}
38 ## END
39
40 #### io->eval() is like eval builtin
41
42 var c = ^(echo one; echo two)
43 var status = io->eval(c)
44
45 # doesn't return anything
46 echo status=$status
47
48 ## STDOUT:
49 one
50 two
51 status=null
52 ## END
53
54 #### captureAll() is like $() but captures stderr and status
55
56 proc p {
57 var captured = 'captured'
58 var cmd = ^(
59 echo stdout
60 echo stderr >&2
61 echo $captured
62 echo $captured >&2
63 printf '\000'
64 exit 42
65 )
66
67 var result = io.captureAll(cmd)
68 pp test_ (result)
69 }
70
71 p
72
73 ## STDOUT:
74 (Dict) {"stdout":"stdout\ncaptured\n\u0000","stderr":"stderr\ncaptured\n","status":42}
75 ## END
76
77 #### captureAll() doesn't fail
78
79 var c = ^(shopt --unset verbose_errexit; echo out; echo err >&2; false; echo two)
80
81 # Hm this prints a message, but no stack trace
82 # Should make it fail I think
83
84 try {
85 var x = io.captureAll(c)
86 }
87 # This has {"code": 3} because it's an expression error. Should probably
88 pp test_ (_error)
89 pp test_ (x)
90
91 ## status: 0
92 ## STDOUT:
93 (Dict) {"code":0}
94 (Dict) {"stdout":"out\n","stderr":"err\n","status":1}
95 ## END
96
97 #### io->eval() with failing command - caller must handle
98
99 var c = ^(echo one; false; echo two)
100
101 try {
102 call io->eval(c)
103 }
104 pp test_ (_error)
105
106 call io->eval(c)
107
108 ## status: 1
109 ## STDOUT:
110 one
111 (Dict) {"code":1}
112 one
113 ## END
114
115 #### io->eval() with exit
116
117 var c = ^(echo one; exit; echo two)
118
119 try {
120 call io->eval(c)
121 }
122 echo 'we do not get here'
123 pp test_ (_error)
124
125
126 ## STDOUT:
127 one
128 ## END
129