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
55
56 echo TODO
57
58 ## STDOUT:
59 ## END
60
61 #### ysh --eval cannot load file
62
63 $[ENV.SH] --eval nonexistent.ysh -c 'echo flag -c'
64
65 ## status: 1
66 ## STDOUT:
67 ## END
68
69 #### ysh --eval parse error
70
71 echo 'echo zz; ( echo' >bad.ysh
72
73 $[ENV.SH] --eval bad.ysh -c 'echo flag -c'
74
75 ## status: 1
76 ## STDOUT:
77 ## END
78
79 #### ysh --eval runtime error
80
81 echo 'echo flag --eval; false; echo bye' >bad.ysh
82
83 $[ENV.SH] --eval bad.ysh -c 'echo flag -c'
84
85 ## status: 1
86 ## STDOUT:
87 flag --eval
88 ## END
89
90 #### ysh --eval exit status
91
92 echo 'echo hi; exit 99; echo bye' >e.ysh
93
94 $[ENV.SH] --eval e.ysh -c 'echo hi'
95
96 ## status: 99
97 ## STDOUT:
98 hi
99 ## END
100
101 #### ysh --eval respects _this_dir
102
103 #echo tmp=$[ENV.TMP]
104
105 var dir = "$[ENV.TMP]/code"
106 mkdir -p $dir
107
108 echo 'echo one; source $_this_dir/two.ysh' > $dir/one.ysh
109 echo 'echo two' > $dir/two.ysh
110
111 $[ENV.SH] --eval $dir/one.ysh -c 'echo flag -c'
112
113 ## STDOUT:
114 one
115 two
116 flag -c
117 ## END
118
119 #### Multiple ysh --eval values
120
121 echo 'echo 1' > one.ysh
122 echo 'echo 2' > two.ysh
123 echo 'echo 3' > three.ysh
124 echo 'echo 4; ( FAIL' > four.ysh
125
126 #$[ENV.SH] -c 'echo flag -c'
127
128 ... $[ENV.SH]
129 --eval one.ysh
130 --eval two.ysh
131 -c 'echo flag -c'
132 ;
133 echo ---
134
135 ... $[ENV.SH]
136 --eval one.ysh
137 --eval two.ysh
138 --eval three.ysh
139 --eval four.ysh
140 -c 'echo flag -c'
141 ;
142
143 ## status: 1
144 ## STDOUT:
145 1
146 2
147 flag -c
148 ---
149 1
150 2
151 3
152 ## END
153
154
155 #### --debug-file
156 var TMP = ENV.TMP
157 $[ENV.SH] --debug-file $TMP/debug.txt -c 'true'
158 grep 'Oils started with' $TMP/debug.txt >/dev/null && echo yes
159 ## stdout: yes
160
161 #### Filename quoting
162
163 echo '(BAD' > no-quoting
164 echo '(BAD' > 'with spaces.sh'
165 echo '(BAD' > $'bad \xff'
166
167 write -n '' > err.txt
168
169 $[ENV.SH] no-quoting 2>>err.txt || true
170 $[ENV.SH] 'with spaces.sh' 2>>err.txt || true
171 $[ENV.SH] $'bad \xff' 2>>err.txt || true
172
173 egrep --only-matching '^.*:1' err.txt
174
175 ## STDOUT:
176 no-quoting:1
177 "with spaces.sh":1
178 b'bad \yff':1
179 ## END
180
181
182 #### shopt --set verbose_errexit
183
184 try {
185 $[ENV.SH] -c '/bin/false' 2>on.txt
186 }
187
188 try {
189 $[ENV.SH] +o verbose_errexit -c '/bin/false' 2>off.txt
190 }
191
192 wc -l on.txt off.txt
193 #echo
194 #cat on.txt off.txt
195
196 ## STDOUT:
197 3 on.txt
198 0 off.txt
199 3 total
200 ## END
201
202 #### YSH shows options correctly (bug fix)
203
204 $[ENV.SH] -o | egrep 'errexit|pipefail'
205
206 ## STDOUT:
207 set -o errexit
208 set -o pipefail
209 ## END
210
211 #### --tool syntax-tree respects frontend/syntax_abbrev.py
212
213 $[ENV.SH] --tool syntax-tree <<< '''
214 echo 'sq'
215 '''
216
217 $[ENV.SH] --tool syntax-tree <<< '''
218 echo "hi $x ${y}"
219 '''
220
221 $[ENV.SH] --tool syntax-tree <<< '''
222 var x = 42 + a
223 '''
224
225 # this reflects the default width
226
227 ## STDOUT:
228 (C (w <Lit_Chars echo>) (w (SQ sq)))
229 (C
230 (w <Lit_Chars echo>)
231 (w (DQ <Lit_Chars "hi "> ($ x) <Lit_Chars " "> (${ VSub_Name y)))
232 )
233 (command.VarDecl
234 keyword:<KW_Var var>
235 lhs:[(NameType left:<Expr_Name x> name:x)]
236 rhs:(expr.Binary op:<Arith_Plus "+"> left:(Const Expr_DecInt _) right:(Var a))
237 )
238 ## END