1 ## oils_failures_allowed: 4
2 ## compare_shells: bash dash mksh zsh
3
4
5 # POSIX rule about special builtins pointed at:
6 #
7 # https://www.reddit.com/r/oilshell/comments/5ykpi3/oildev_is_alive/
8
9 #### : is special and prefix assignments persist after special builtins
10 case $SH in
11 dash|zsh|*osh)
12 ;;
13 *)
14 # for bash
15 set -o posix
16 ;;
17 esac
18 foo=bar :
19 echo foo=$foo
20 ## STDOUT:
21 foo=bar
22 ## END
23 ## BUG zsh STDOUT:
24 foo=
25 ## END
26
27 #### readonly is special and prefix assignments persist
28
29 # Bash only implements it behind the posix option
30 case $SH in
31 dash|zsh|*osh)
32 ;;
33 *)
34 # for bash
35 set -o posix
36 ;;
37 esac
38 foo=bar readonly spam=eggs
39 echo foo=$foo
40 echo spam=$spam
41
42 # should NOT be exported
43 printenv.py foo
44 printenv.py spam
45 ## STDOUT:
46 foo=bar
47 spam=eggs
48 None
49 None
50 ## END
51 ## BUG bash STDOUT:
52 foo=bar
53 spam=eggs
54 bar
55 None
56 ## END
57
58 #### true is not special
59 foo=bar true
60 echo $foo
61 ## stdout:
62
63 #### Shift is special and the whole script exits if it returns non-zero
64 test -n "$BASH_VERSION" && set -o posix
65 set -- a b
66 shift 3
67 echo status=$?
68 ## stdout-json: ""
69 ## status: 1
70 ## OK dash status: 2
71 ## BUG bash/zsh status: 0
72 ## BUG bash/zsh STDOUT:
73 status=1
74 ## END
75
76 #### set is special and fails, even if using || true
77 shopt -s invalid_ || true
78 echo ok
79 set -o invalid_ || true
80 echo should not get here
81 ## STDOUT:
82 ok
83 ## END
84 ## status: 1
85 ## OK dash status: 2
86 ## BUG bash status: 0
87 ## BUG bash STDOUT:
88 ok
89 should not get here
90 ## END
91
92 #### Special builtins can't be redefined as functions
93 # bash manual says they are 'found before' functions.
94 test -n "$BASH_VERSION" && set -o posix
95 export() {
96 echo 'export func'
97 }
98 export hi
99 echo status=$?
100 ## status: 2
101 ## BUG mksh/zsh status: 0
102 ## BUG mksh/zsh stdout: status=0
103
104 #### Non-special builtins CAN be redefined as functions
105 test -n "$BASH_VERSION" && set -o posix
106 true() {
107 echo 'true func'
108 }
109 true hi
110 echo status=$?
111 ## STDOUT:
112 true func
113 status=0
114 ## END