1 # Oil Blocks
2
3
4 #### cd with block
5 shopt -s oil:all
6 # OLDPWD is NOT defined
7 cd / { echo $PWD; echo OLDPWD=${OLDPWD:-} }; echo done
8 echo $(basename $PWD) # restored
9 cd /tmp {
10 write PWD=$PWD
11 write -sep ' ' pwd builtin: $(pwd)
12 }
13 echo $(basename $PWD) # restored
14 ## STDOUT:
15 /
16 OLDPWD=
17 done
18 oil-blocks.test.sh
19 PWD=/tmp
20 pwd builtin: /tmp
21 oil-blocks.test.sh
22 ## END
23
24 #### cd with block: fatal error in block
25 shopt -s oil:all
26 cd / {
27 echo one
28 false
29 echo two
30 }
31 ## status: 1
32 ## STDOUT:
33 one
34 ## END
35
36
37 #### cd with block: return in block
38 shopt -s oil:all
39 f() {
40 cd / {
41 echo one
42 return
43 echo two
44 }
45 echo 'end func'
46 }
47 f
48 ## STDOUT:
49 one
50 end func
51 ## END
52
53 #### cd with block: break in block
54 shopt -s oil:all
55 f() {
56 cd / {
57 echo one
58 for i in 1 2; do
59 echo $i
60 break # break out of loop
61 done
62
63 break # break out of block isn't valid
64 echo two
65 }
66 echo end func
67 }
68 f
69 ## status: 1
70 ## STDOUT:
71 one
72 1
73 ## END
74
75 #### cd with block exits with status 0
76 shopt -s oil:all
77 cd / {
78 echo block
79
80 # This return value is ignored.
81 # Or maybe this should be a runtime error?
82 return 1
83 }
84 echo status=$?
85 ## STDOUT:
86 block
87 status=0
88 ## END
89
90 #### block doesn't have its own scope
91 shopt -s oil:all
92 var x = 1
93 echo "x=$x"
94 cd / {
95 #set y = 5 # This would be an error because set doesn't do dynamic lookup
96 var x = 42
97 echo "x=$x"
98 }
99 echo "x=$x"
100 ## STDOUT:
101 x=1
102 x=42
103 x=42
104 ## END
105
106 #### block literal in expression mode: ^(echo $PWD)
107 shopt -s oil:all
108
109 const myblock = ^(echo $PWD | wc -l)
110 const b2 = ^(echo one; echo two)
111 = myblock
112 = b2
113
114 # TODO:
115 # Implement something like this?
116 # _ evalexpr(b2, binding_dict) # e.g. to bind to QTSV fields
117 # _ evalblock(b2, binding_dict)
118
119 ## STDOUT:
120 one
121 two
122 ## END
123
124 #### 'builtin' and 'command' with block
125 shopt --set oil:basic
126 builtin cd / {
127 echo "builtin $PWD"
128 }
129 command cd / {
130 echo "command $PWD"
131 }
132 ## STDOUT:
133 builtin /
134 command /
135 ## END