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 | (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
|