1 ## our_shell: ysh
2 ## oils_failures_allowed: 1
3
4 #### ysh --location-str --location-start-line
5
6 set +o errexit
7
8 $[ENV.SH] --location-str foo.hay --location-start-line 42 -c 'echo ()' 2>err.txt
9
10 cat err.txt | grep -o -- '-- foo.hay:42: Unexpected'
11
12
13 # common idiom is to use -- to say it came from a file
14 $[ENV.SH] --location-str '[ stdin ]' --location-start-line 10 -c 'echo "line 10";
15 echo ()' 2>err.txt
16
17 cat err.txt | fgrep -o -- '-- [ stdin ]:11: Unexpected'
18
19 ## STDOUT:
20 -- foo.hay:42: Unexpected
21 line 10
22 -- [ stdin ]:11: Unexpected
23 ## END
24
25 #### ysh --eval
26
27 # args are available in both, similar to --rcfile
28 echo 'echo one --eval: @ARGV' >one.ysh
29 $[ENV.SH] --eval one.ysh -c 'echo flag -c: @ARGV' dummy x y z
30 echo
31
32 echo 'echo myscript: @ARGV' >myscript.sh
33 $[ENV.SH] --eval one.ysh myscript.sh a b c
34 echo
35
36 # eval comes before oshrc
37 echo 'echo yshrc: @ARGV' >yshrc
38 $[ENV.SH] --rcfile yshrc --eval one.ysh -i -c 'echo flag -c: @ARGV' dummy P Q
39 echo
40
41 ## STDOUT:
42 one --eval: x y z
43 flag -c: x y z
44
45 one --eval: a b c
46 myscript: a b c
47
48 one --eval: P Q
49 yshrc: P Q
50 flag -c: P Q
51
52 ## END
53
54 #### ysh --eval-pure can evaluate funcs and procs
55
56 echo >pure.ysh '
57 proc my-proc { echo "my-proc" }
58 func myFunc() { return ("myFunc") }
59 '
60
61 $[ENV.SH] --eval-pure pure.ysh -c 'my-proc; echo $[myFunc()]'
62
63 ## STDOUT:
64 my-proc
65 myFunc
66 ## END
67
68 #### ysh --eval-pure can't run impure
69
70 echo >pure.ysh '
71 proc my-proc { echo "my-proc" }
72 func myFunc() { return ("myFunc") }
73 '
74
75 echo >impure.ysh 'my-proc; echo $[myFunc()]'
76
77 # There should be an error on 'echo' - it can't even write to stdout?
78 #
79 # Or definitely ls
80 #
81 # Can this print to stdout?
82 #
83 # call myFunc()
84 #
85 # Right now we can do this:
86 # { call myFunc() } | wc -l
87
88 $[ENV.SH] --eval-pure pure.ysh --eval-pure impure.ysh -c ''
89
90 ## status: 1
91 ## STDOUT:
92 ## END
93
94
95 #### ysh --eval cannot load file
96
97 $[ENV.SH] --eval nonexistent.ysh -c 'echo flag -c'
98
99 ## status: 1
100 ## STDOUT:
101 ## END
102
103 #### ysh --eval parse error
104
105 echo 'echo zz; ( echo' >bad.ysh
106
107 $[ENV.SH] --eval bad.ysh -c 'echo flag -c'
108
109 ## status: 1
110 ## STDOUT:
111 ## END
112
113 #### ysh --eval runtime error
114
115 echo 'echo flag --eval; false; echo bye' >bad.ysh
116
117 $[ENV.SH] --eval bad.ysh -c 'echo flag -c'
118
119 ## status: 1
120 ## STDOUT:
121 flag --eval
122 ## END
123
124 #### ysh --eval exit status
125
126 echo 'echo hi; exit 99; echo bye' >e.ysh
127
128 $[ENV.SH] --eval e.ysh -c 'echo hi'
129
130 ## status: 99
131 ## STDOUT:
132 hi
133 ## END
134
135 #### ysh --eval respects _this_dir and $0
136
137 #echo tmp=$[ENV.TMP]
138
139 var dir = "$[ENV.TMP]/code"
140 mkdir -p $dir
141
142 echo '
143 echo one
144 source $_this_dir/two.ysh
145 ' > $dir/one.ysh
146 echo 'echo two' > $dir/two.ysh
147
148 echo '
149 proc p {
150 echo three @ARGV
151 }
152 p AA
153 var x = $0
154 echo "dollar0 = $(basename $x)"
155 ' > $dir/three.ysh
156 chmod +x $dir/three.ysh
157
158 $[ENV.SH] --eval $dir/one.ysh --eval $dir/three.ysh -c 'echo flag -c'
159
160 ## STDOUT:
161 one
162 two
163 three AA
164 dollar0 = three.ysh
165 flag -c
166 ## END
167
168 #### Multiple ysh --eval values
169
170 echo 'echo 1' > one.ysh
171 echo 'echo 2' > two.ysh
172 echo 'echo 3' > three.ysh
173 echo 'echo 4; ( FAIL' > four.ysh
174
175 #$[ENV.SH] -c 'echo flag -c'
176
177 ... $[ENV.SH]
178 --eval one.ysh
179 --eval two.ysh
180 -c 'echo flag -c'
181 ;
182 echo ---
183
184 ... $[ENV.SH]
185 --eval one.ysh
186 --eval two.ysh
187 --eval three.ysh
188 --eval four.ysh
189 -c 'echo flag -c'
190 ;
191
192 ## status: 1
193 ## STDOUT:
194 1
195 2
196 flag -c
197 ---
198 1
199 2
200 3
201 ## END
202
203
204 #### --debug-file
205 var TMP = ENV.TMP
206 $[ENV.SH] --debug-file $TMP/debug.txt -c 'true'
207 grep 'Oils started with' $TMP/debug.txt >/dev/null && echo yes
208 ## stdout: yes
209
210 #### Filename quoting
211
212 echo '(BAD' > no-quoting
213 echo '(BAD' > 'with spaces.sh'
214 echo '(BAD' > b'bad \yff'
215
216 write -n '' > err.txt
217
218 $[ENV.SH] no-quoting 2>>err.txt || true
219 $[ENV.SH] 'with spaces.sh' 2>>err.txt || true
220 $[ENV.SH] b'bad \yff' 2>>err.txt || true
221
222 egrep --only-matching '^.*:1' err.txt
223
224 ## STDOUT:
225 no-quoting:1
226 "with spaces.sh":1
227 b'bad \yff':1
228 ## END
229
230
231 #### shopt --set verbose_errexit
232
233 try {
234 $[ENV.SH] -c '/bin/false' 2>on.txt
235 }
236
237 try {
238 $[ENV.SH] +o verbose_errexit -c '/bin/false' 2>off.txt
239 }
240
241 wc -l on.txt off.txt
242 #echo
243 #cat on.txt off.txt
244
245 ## STDOUT:
246 3 on.txt
247 0 off.txt
248 3 total
249 ## END
250
251 #### YSH shows options correctly (bug fix)
252
253 $[ENV.SH] -o | egrep 'errexit|pipefail'
254
255 ## STDOUT:
256 set -o errexit
257 set -o pipefail
258 ## END
259
260 #### --tool syntax-tree respects frontend/syntax_abbrev.py
261
262 $[ENV.SH] --tool syntax-tree <<< '''
263 echo 'sq'
264 '''
265
266 $[ENV.SH] --tool syntax-tree <<< '''
267 echo "hi $x ${y}"
268 '''
269
270 $[ENV.SH] --tool syntax-tree <<< '''
271 var x = 42 + a
272 '''
273
274 # this reflects the default width
275
276 ## STDOUT:
277 (C (w <Lit_Chars echo>) (w (SQ sq)))
278 (C
279 (w <Lit_Chars echo>)
280 (w (DQ <Lit_Chars "hi "> ($ x) <Lit_Chars " "> (${ VSub_Name y)))
281 )
282 (VarDecl
283 keyword:<KW_Var var>
284 lhs:[(NameType left:<Expr_Name x> name:x)]
285 rhs:(expr.Binary op:<Arith_Plus "+"> left:(Const Expr_DecInt _) right:(Var a))
286 )
287 ## END