1 | ## compare_shells: bash mksh zsh ash
|
2 |
|
3 | # dash doesn't have echo -e, $'', etc.
|
4 |
|
5 | # TODO: fix J8 bug causing failure
|
6 |
|
7 | # Cross-cutting test of serialization formats. That is, what J8 Notation
|
8 | # should fix.
|
9 | #
|
10 | # TODO: Also see spec/xtrace for another use case.
|
11 |
|
12 | #### printf %q newline
|
13 | case $SH in (ash) return ;; esac # yash and ash don't implement this
|
14 |
|
15 | newline=$'one\ntwo'
|
16 | printf '%q\n' "$newline"
|
17 |
|
18 | quoted="$(printf '%q\n' "$newline")"
|
19 | restored=$(eval "echo $quoted")
|
20 | test "$newline" = "$restored" && echo roundtrip-ok
|
21 |
|
22 | ## STDOUT:
|
23 | $'one\ntwo'
|
24 | roundtrip-ok
|
25 | ## END
|
26 | ## OK mksh STDOUT:
|
27 | 'one'$'\n''two'
|
28 | roundtrip-ok
|
29 | ## END
|
30 | ## OK zsh STDOUT:
|
31 | one$'\n'two
|
32 | roundtrip-ok
|
33 | ## END
|
34 | ## N-I ash stdout-json: ""
|
35 |
|
36 | #### printf %q spaces
|
37 | case $SH in (ash) return ;; esac # yash and ash don't implement this
|
38 |
|
39 | # bash does a weird thing and uses \
|
40 |
|
41 | spaces='one two'
|
42 | printf '%q\n' "$spaces"
|
43 |
|
44 | ## STDOUT:
|
45 | 'one two'
|
46 | ## END
|
47 | ## OK bash/zsh STDOUT:
|
48 | one\ two
|
49 | ## END
|
50 | ## N-I ash stdout-json: ""
|
51 |
|
52 | #### printf %q quotes
|
53 | case $SH in (ash) return ;; esac # yash and ash don't implement %q
|
54 |
|
55 | quotes=\'\"
|
56 | printf '%q\n' "$quotes"
|
57 |
|
58 | quoted="$(printf '%q\n' "$quotes")"
|
59 | restored=$(eval "echo $quoted")
|
60 | test "$quotes" = "$restored" && echo roundtrip-ok
|
61 |
|
62 | ## STDOUT:
|
63 | \'\"
|
64 | roundtrip-ok
|
65 | ## END
|
66 | ## OK osh STDOUT:
|
67 | $'\'"'
|
68 | roundtrip-ok
|
69 | ## END
|
70 | ## BUG mksh STDOUT:
|
71 | ''\''"'
|
72 | roundtrip-ok
|
73 | ## END
|
74 | ## N-I ash stdout-json: ""
|
75 |
|
76 | #### printf %q unprintable
|
77 | case $SH in (ash) return ;; esac # yash and ash don't implement this
|
78 |
|
79 | unprintable=$'\xff'
|
80 | printf '%q\n' "$unprintable"
|
81 |
|
82 | # bash and zsh agree
|
83 | ## STDOUT:
|
84 | $'\377'
|
85 | ## END
|
86 | ## OK osh STDOUT:
|
87 | $'\xff'
|
88 | ## END
|
89 | ## BUG mksh STDOUT:
|
90 | ''$'\377'
|
91 | ## END
|
92 | ## N-I ash stdout-json: ""
|
93 |
|
94 | #### printf %q unicode
|
95 | case $SH in (ash) return ;; esac # yash and ash don't implement this
|
96 |
|
97 | unicode=$'\u03bc'
|
98 | unicode=$'\xce\xbc' # does the same thing
|
99 |
|
100 | printf '%q\n' "$unicode"
|
101 |
|
102 | # Oil issue: we have quotes. Isn't that OK?
|
103 | ## STDOUT:
|
104 | μ
|
105 | ## END
|
106 | ## OK osh STDOUT:
|
107 | 'μ'
|
108 | ## END
|
109 | ## N-I ash stdout-json: ""
|
110 |
|
111 | #### printf %q invalid unicode
|
112 | case $SH in (ash) return ;; esac
|
113 |
|
114 | # Hm bash/mksh/zsh understand these. They are doing decoding and error
|
115 | # recovery! inspecting the bash source seems to confirm this.
|
116 | unicode=$'\xce'
|
117 | printf '%q\n' "$unicode"
|
118 |
|
119 | unicode=$'\xce\xce\xbc'
|
120 | printf '%q\n' "$unicode"
|
121 |
|
122 | unicode=$'\xce\xbc\xce'
|
123 | printf '%q\n' "$unicode"
|
124 |
|
125 | case $SH in (mksh) return ;; esac # it prints unprintable chars here!
|
126 |
|
127 | unicode=$'\xcea'
|
128 | printf '%q\n' "$unicode"
|
129 | unicode=$'a\xce'
|
130 | printf '%q\n' "$unicode"
|
131 | ## STDOUT:
|
132 | $'\xce'
|
133 | $'\xceμ'
|
134 | $'μ\xce'
|
135 | $'\xcea'
|
136 | $'a\xce'
|
137 | ## END
|
138 | ## OK bash STDOUT:
|
139 | $'\316'
|
140 | $'\316μ'
|
141 | $'μ\316'
|
142 | $'\316a'
|
143 | $'a\316'
|
144 | ## END
|
145 | ## BUG mksh STDOUT:
|
146 | ''$'\316'
|
147 | ''$'\316''μ'
|
148 | 'μ'$'\316'
|
149 | ## END
|
150 | ## OK zsh STDOUT:
|
151 | $'\316'
|
152 | $'\316'μ
|
153 | μ$'\316'
|
154 | $'\316'a
|
155 | a$'\316'
|
156 | ## END
|
157 | ## N-I ash stdout-json: ""
|
158 |
|
159 | #### set
|
160 | case $SH in (zsh) return ;; esac # zsh doesn't make much sense
|
161 |
|
162 | zz=$'one\ntwo'
|
163 |
|
164 | set | grep zz
|
165 | ## STDOUT:
|
166 | zz=$'one\ntwo'
|
167 | ## END
|
168 | ## OK ash stdout-json: "zz='one\n"
|
169 | ## BUG zsh stdout-json: ""
|
170 |
|
171 |
|
172 | #### declare
|
173 | case $SH in (ash|zsh) return ;; esac # zsh doesn't make much sense
|
174 |
|
175 | zz=$'one\ntwo'
|
176 |
|
177 | typeset | grep zz
|
178 | typeset -p zz
|
179 |
|
180 | ## STDOUT:
|
181 | zz=$'one\ntwo'
|
182 | declare -- zz=$'one\ntwo'
|
183 | ## END
|
184 |
|
185 | ## OK mksh STDOUT:
|
186 | typeset zz
|
187 | typeset zz=$'one\ntwo'
|
188 | ## BUG zsh stdout-json: ""
|
189 | ## N-I ash stdout-json: ""
|
190 |
|
191 | #### ${var@Q}
|
192 | case $SH in (zsh|ash) exit ;; esac
|
193 |
|
194 | zz=$'one\ntwo \u03bc'
|
195 |
|
196 | # weirdly, quoted and unquoted aren't different
|
197 | echo ${zz@Q}
|
198 | echo "${zz@Q}"
|
199 | ## STDOUT:
|
200 | $'one\ntwo μ'
|
201 | $'one\ntwo μ'
|
202 | ## END
|
203 | ## OK mksh STDOUT:
|
204 | $'one
|
205 | two μ'
|
206 | $'one
|
207 | two μ'
|
208 | ## END
|
209 | ## N-I ash/zsh stdout-json: ""
|
210 |
|
211 | #### xtrace
|
212 | zz=$'one\ntwo'
|
213 | set -x
|
214 | echo "$zz"
|
215 | ## STDOUT:
|
216 | one
|
217 | two
|
218 | ## END
|
219 | ## STDERR:
|
220 | + echo $'one\ntwo'
|
221 | ## END
|
222 | ## OK bash/ash STDERR:
|
223 | + echo 'one
|
224 | two'
|
225 | ## END
|
226 | ## OK zsh STDERR:
|
227 | +zsh:3> echo 'one
|
228 | two'
|
229 | ## END
|
230 |
|