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
136
137 #echo tmp=$[ENV.TMP]
138
139 var dir = "$[ENV.TMP]/code"
140 mkdir -p $dir
141
142 echo 'echo one; source $_this_dir/two.ysh' > $dir/one.ysh
143 echo 'echo two' > $dir/two.ysh
144
145 $[ENV.SH] --eval $dir/one.ysh -c 'echo flag -c'
146
147 ## STDOUT:
148 one
149 two
150 flag -c
151 ## END
152
153 #### Multiple ysh --eval values
154
155 echo 'echo 1' > one.ysh
156 echo 'echo 2' > two.ysh
157 echo 'echo 3' > three.ysh
158 echo 'echo 4; ( FAIL' > four.ysh
159
160 #$[ENV.SH] -c 'echo flag -c'
161
162 ... $[ENV.SH]
163 --eval one.ysh
164 --eval two.ysh
165 -c 'echo flag -c'
166 ;
167 echo ---
168
169 ... $[ENV.SH]
170 --eval one.ysh
171 --eval two.ysh
172 --eval three.ysh
173 --eval four.ysh
174 -c 'echo flag -c'
175 ;
176
177 ## status: 1
178 ## STDOUT:
179 1
180 2
181 flag -c
182 ---
183 1
184 2
185 3
186 ## END
187
188
189 #### --debug-file
190 var TMP = ENV.TMP
191 $[ENV.SH] --debug-file $TMP/debug.txt -c 'true'
192 grep 'Oils started with' $TMP/debug.txt >/dev/null && echo yes
193 ## stdout: yes
194
195 #### Filename quoting
196
197 echo '(BAD' > no-quoting
198 echo '(BAD' > 'with spaces.sh'
199 echo '(BAD' > $'bad \xff'
200
201 write -n '' > err.txt
202
203 $[ENV.SH] no-quoting 2>>err.txt || true
204 $[ENV.SH] 'with spaces.sh' 2>>err.txt || true
205 $[ENV.SH] $'bad \xff' 2>>err.txt || true
206
207 egrep --only-matching '^.*:1' err.txt
208
209 ## STDOUT:
210 no-quoting:1
211 "with spaces.sh":1
212 b'bad \yff':1
213 ## END
214
215
216 #### shopt --set verbose_errexit
217
218 try {
219 $[ENV.SH] -c '/bin/false' 2>on.txt
220 }
221
222 try {
223 $[ENV.SH] +o verbose_errexit -c '/bin/false' 2>off.txt
224 }
225
226 wc -l on.txt off.txt
227 #echo
228 #cat on.txt off.txt
229
230 ## STDOUT:
231 3 on.txt
232 0 off.txt
233 3 total
234 ## END
235
236 #### YSH shows options correctly (bug fix)
237
238 $[ENV.SH] -o | egrep 'errexit|pipefail'
239
240 ## STDOUT:
241 set -o errexit
242 set -o pipefail
243 ## END
244
245 #### --tool syntax-tree respects frontend/syntax_abbrev.py
246
247 $[ENV.SH] --tool syntax-tree <<< '''
248 echo 'sq'
249 '''
250
251 $[ENV.SH] --tool syntax-tree <<< '''
252 echo "hi $x ${y}"
253 '''
254
255 $[ENV.SH] --tool syntax-tree <<< '''
256 var x = 42 + a
257 '''
258
259 # this reflects the default width
260
261 ## STDOUT:
262 (C (w <Lit_Chars echo>) (w (SQ sq)))
263 (C
264 (w <Lit_Chars echo>)
265 (w (DQ <Lit_Chars "hi "> ($ x) <Lit_Chars " "> (${ VSub_Name y)))
266 )
267 (command.VarDecl
268 keyword:<KW_Var var>
269 lhs:[(NameType left:<Expr_Name x> name:x)]
270 rhs:(expr.Binary op:<Arith_Plus "+"> left:(Const Expr_DecInt _) right:(Var a))
271 )
272 ## END