OILS / doc / ref / chap-option.md View on Github | oils.pub

391 lines, 253 significant
1---
2title: Global Shell Options (Oils Reference)
3all_docs_url: ..
4body_css_class: width40
5default_highlighter: oils-sh
6preserve_anchor_case: yes
7---
8
9<div class="doc-ref-header">
10
11[Oils Reference](index.html) &mdash;
12Chapter **Global Shell Options**
13
14</div>
15
16This chapter describes global shell options in Oils. Some options are from
17POSIX shell, and some are from [bash]($xref). We also use options to turn
18[OSH]($xref) into [YSH]($xref).
19
20<span class="in-progress">(in progress)</span>
21
22<div id="dense-toc">
23</div>
24
25## Errors
26
27These options are from POSIX shell:
28
29 nounset -u
30 errexit -e
31 pipefail
32
33These are from bash:
34
35 inherit_errexit
36
37## Globbing
38
39These options are from POSIX shell:
40
41 noglob -f
42
43From bash:
44
45 nullglob failglob dotglob
46
47From Oils:
48
49 dashglob
50
51Some details:
52
53### nullglob
54
55When `nullglob` is on, a glob matching no files expands to no arguments:
56
57 shopt -s nullglob
58 $ echo L *.py R
59 L R
60
61Without this option, the glob string itself is returned:
62
63 $ echo L *.py R # no Python files in this dir
64 L *.py R
65
66(This option is from GNU bash.)
67
68### dashglob
69
70Do globs return results that start with `-`? It's on by default in `bin/osh`,
71but off when YSH is enabled.
72
73Turning it off prevents a command like `rm *` from being confused by a file
74called `-rf`.
75
76 $ touch -- myfile -rf
77
78 $ echo *
79 -rf myfile
80
81 $ shopt -u dashglob
82 $ echo *
83 myfile
84
85## Other Option
86
87 noclobber -C # Redirects can't overwrite files
88
89## Debugging
90
91<h3 id="errtrace">errtrace (-E)</h3>
92
93Enable the ERR [trap][] in both shell functions and subshells.
94
95The option is also `set -E`. It's designed to be compatible with bash.
96
97[trap]: chap-builtin-cmd.html#trap
98
99### extdebug
100
101Show more info in when printing functions with `declare -f`. Used by
102`task-five.sh`.
103
104<h3 id="xtrace">xtrace (-x)</h3>
105
106Show execution traces.
107
108- In OSH, the [PS4][] variables control the display.
109- In YSH, the `SHX_*` variables control the display.
110
111[PS4]: chap-plugin.html#PS4
112
113This option is also `set -x`. It's required by POSIX shell.
114
115### verbose
116
117Not implemented.
118
119This option is from POSIX shell.
120
121## Interactive
122
123These options are from bash.
124
125 emacs vi
126
127
128## Compat
129
130### eval_unsafe_arith
131
132Allow dynamically parsed `a[$(echo 42)]` For bash compatibility.
133
134### ignore_flags_not_impl
135
136Suppress failures from unimplemented flags. Example:
137
138 shopt --set ignore_flags_not_impl
139
140 declare -i foo=2+3 # not evaluated to 5, but doesn't fail either
141
142This option can be useful for "getting past" errors while testing.
143
144### ignore_shopt_not_impl
145
146Suppress failures from unimplemented shell options. Example:
147
148 shopt --set ignore_shopt_not_impl
149
150 shopt --set xpg_echo # exit with status 0, not 1
151 # this is a bash option that OSH doesn't implement
152
153This option can be useful for "getting past" errors while testing.
154
155## Optimize
156
157### rewrite_extern
158
159This options enables a transparent rewriting of external commands to
160**builtins**.
161
162Currently, these commands **may** be rewritten, depending on their `argv`:
163
164- [cat][]
165- [rm][]
166
167These optimizations are *sound* - they should not affect the behavior of
168programs on POSIX system.
169
170---
171
172This option is on by default in OSH and YSH, but it applies only in
173non-interactive shells. That is, in interactive shells, commands are **never**
174rewritten, regardless of the value of `rewrite_extern`.
175
176[cat]: chap-builtin-cmd.html#cat
177[rm]: chap-builtin-cmd.html#rm
178
179## Groups
180
181To turn OSH into YSH, we use three option groups. Some of them allow new
182features, and some disallow old features.
183
184<!-- note: explicit anchor necessary because of mangling -->
185<h3 id="strict:all">strict:all</h3>
186
187Option in this group disallow problematic or confusing shell constructs. The
188resulting script will still run in another shell.
189
190 shopt --set strict:all # turn on all options
191 shopt -p strict:all # print their current state
192
193Parsing options:
194
195 strict_parse_equals # Disallow '=x' to avoid confusion with '= x'
196 strict_parse_slice # No implicit length for ${a[@]::}
197 X strict_parse_utf8 # Source code must be valid UTF-8
198
199Runtime options:
200
201 strict_arg_parse # Disallow additional arguments to some builtins
202 strict_argv # No empty argv
203 strict_arith # Fatal parse errors (on by default)
204 strict_array # Arrays and strings aren't confused
205 strict_control_flow # Disallow misplaced keyword, empty arg
206 strict_env_binding # Prefix bindings must always be env bindings
207 strict_errexit # Disallow code that ignores failure
208 strict_nameref # Trap invalid variable names
209 strict_word_eval # Expose unicode and slicing errors
210 strict_tilde # Tilde subst can result in error
211 X strict_glob # Parse the sublanguage more strictly
212
213<h3 id="ysh:upgrade">ysh:upgrade</h3>
214
215Options in this group enable new YSH features. It doesn't break existing shell
216scripts when it's avoidable.
217
218For example, `parse_at` means that `@myarray` is now the operation to splice
219an array. This will break scripts that expect `@` to be literal, but you can
220simply quote it like `'@literal'` to fix the problem.
221
222 shopt --set ysh:upgrade # turn on all options
223 shopt -p ysh:upgrade # print their current state
224
225Details on each option:
226
227 parse_at echo @array @[arrayfunc(x, y)]
228 parse_brace if true { ... }; cd ~/src { ... }
229 parse_equals x = 'val' in Caps { } config blocks
230 parse_paren if (x > 0) ...
231 parse_proc proc p { ... }
232 parse_triple_quote """$x""" '''x''' (command mode)
233 parse_ysh_string echo r'\' u'\\' b'\\' (command mode)
234 parse_subexpr_shorthand Makes $[] a YSH expression sub instead of a backwards-compatible equivalent of an arithmetic expression
235 command_sub_errexit Synchronous errexit check
236 process_sub_fail Analogous to pipefail for process subs
237 sigpipe_status_ok status 141 -> 0 in pipelines
238 simple_word_eval No splitting, static globbing
239 xtrace_rich Hierarchical and process tracing
240 no_xtrace_osh Disable OSH tracing with +
241 no_dash_glob Avoid globbing files like -rf
242 env_obj Init ENV Obj at startup; use it when starting
243 child processes
244 init_ysh_globals Init ARGV List at startup
245 for_loop_frames YSH can create closures from loop vars
246 verbose_errexit Whether to print detailed errors
247 verbose_warn Print various warnings to stderr
248
249<h3 id="ysh:all">ysh:all</h3>
250
251Enable the full YSH language. This includes everything in the `ysh:upgrade`
252group and the `strict:all` group.
253
254 shopt --set ysh:all # turn on all options
255 shopt -p ysh:all # print their current state
256
257Details on options that are not in `ysh:upgrade` and `strict:all`:
258
259 expand_aliases (-u) Whether aliases are expanded
260 parse_at_all @ starting any word is an operator
261 no_parse_backslash Disallow bad backslashes in "" and $''
262 no_parse_backticks Disallow `echo hi`
263 no_parse_bare_word Disallow 'case unquoted' 'for x in unquoted'
264 no_parse_dbracket Disallow legacy booleans [[
265 no_parse_dollar Disallow bare $ for \$ (maybe $/d+/)
266 no_parse_dparen Disallow legacy arithmetic ((
267 no_parse_ignored Don't parse redirects that are ignored
268 no_parse_osh No $'' ( ) & TODO ${x%prefix} ${a[@]} $$
269 no_parse_sh_arith Disallow legacy shell arithmetic
270 no_parse_word_join Disallow pitfall --flag=r'value'
271 no_exported Environ doesn't correspond to exported (-x) vars
272 no_init_globals At startup, don't set vars like PWD, SHELLOPTS
273 no_osh_builtins Disallow OSH builtins like alias, unalias, etc.
274 simple_echo echo doesn't accept -e -n
275 simple_eval_builtin eval takes exactly 1 argument
276 simple_test_builtin test takes 2 or 3 args; use test not [
277 simple_trap_builtin trap doesn't take a code string, etc.
278 X simple_trap Function name only
279
280**Caveat**: Some options only affect shell startup. For example:
281
282- If you start with `osh`, and the script runs `shopt --set ysh:all`, then the
283 YSH [ARGV][] var won't be initialized.
284- In contrast, if you run `osh -o ysh:all -c 'echo @ARGV'`, then [ARGV][] will
285 be initialized. That is, shell startup is done "the YSH way".
286
287[ARGV]: chap-special-var.html#ARGV
288
289## YSH Details
290
291### opts-redefine
292
293In the interactive shell, you can redefine procs and funcs.
294
295 redefine_source 'source-guard' builtin always returns 0
296 X redefine_const Can consts be redefined?
297
298### opts-internal
299
300These options are used by the interpreter. You generally shouldn't set them
301yourself.
302
303 _allow_command_sub To implement strict_errexit, eval_unsafe_arith
304 _allow_process_sub To implement strict_errexit
305 dynamic_scope To implement proc and func
306 _no_debug_trap Used in pipelines in job control shell
307 _running_trap To disable strict_errexit
308 _running_hay Hay evaluation
309
310## Unlinked Descriptions
311
312Here are some descriptions of individual options.
313
314### strict_control_flow
315
316Disallow `break` and `continue` at the top level, and disallow empty args like
317`return $empty`.
318
319### strict_tilde
320
321Failed tilde expansions cause hard errors (like zsh) rather than silently
322evaluating to `~` or `~bad`.
323
324
325### strict_nameref
326
327When `strict_nameref` is set, undefined references produce fatal errors:
328
329 declare -n ref
330 echo $ref # fatal error, not empty string
331 ref=x # fatal error instead of decaying to non-reference
332
333References that don't contain variables also produce hard errors:
334
335 declare -n ref='not a var'
336 echo $ref # fatal
337 ref=x # fatal
338
339### no_parse_ignored
340
341For compatibility, OSH will parse some constructs it doesn't execute, like:
342
343 return 0 2>&1 # redirect on control flow
344
345When this option is disabled, that statement is a syntax error.
346
347### parse_triple_quote
348
349Parse the shell-style multi-line strings, which strip leading whitespace:
350
351 echo '''
352 one
353 two
354 '''
355
356 echo """
357 hello
358 $name
359 """
360
361(This option affects only command mode. Such strings are always parsed in
362expression mode.)
363
364### parse_ysh_string
365
366Allow `r'\'` and `u'\\'` and `b'\\'` strings, as well as their multi-line
367versions.
368
369Since shell strings are already raw, this means that YSH just ignores the r
370prefix:
371
372 echo r'\' # a single backslash
373
374J8 unicode strings:
375
376 echo u'mu \u{3bc}' # mu char
377
378J8 byte strings:
379
380 echo b'byte \yff'
381
382(This option affects only command mode. Such strings are always parsed in
383expression mode.)
384
385### sigpipe_status_ok
386
387If a process that's part of a pipeline exits with status 141 when this is
388option is on, it's turned into status 0, which avoids failure.
389
390SIGPIPE errors occur in cases like 'yes | head', and generally aren't useful.
391