OILS / spec / process-sub.test.sh View on Github | oilshell.org

201 lines, 111 significant
1
2#### Process sub input
3f=_tmp/process-sub.txt
4{ echo 1; echo 2; echo 3; } > $f
5cat <(head -n 2 $f) <(tail -n 2 $f)
6## STDOUT:
71
82
92
103
11## END
12
13#### Process sub from external process to stdin
14seq 3 > >(tac)
15## STDOUT:
163
172
181
19## END
20
21#### Process sub from shell to stdin
22{ echo 1; echo 2; echo 3; } > >(tac)
23## STDOUT:
243
252
261
27## END
28
29#### Non-linear pipeline with >()
30stdout_stderr() {
31 echo o1
32 echo o2
33
34 sleep 0.1 # Does not change order
35
36 { echo e1;
37 echo warning: e2
38 echo e3;
39 } >& 2
40}
41stdout_stderr 2> >(grep warning) | tac >$TMP/out.txt
42wait $! # this does nothing in bash 4.3, but probably does in bash 4.4.
43echo OUT
44cat $TMP/out.txt
45# PROBLEM -- OUT comes first, and then 'warning: e2', and then 'o2 o1'. It
46# looks like it's because nobody waits for the proc sub.
47# http://lists.gnu.org/archive/html/help-bash/2017-06/msg00018.html
48## STDOUT:
49OUT
50warning: e2
51o2
52o1
53## END
54
55#### $(<file) idiom with process sub
56echo FOO >foo
57
58# works in bash and zsh
59echo $(<foo)
60
61# this works in zsh, but not in bash
62tr A-Z a-z < <(<foo)
63
64cat < <(<foo; echo hi)
65
66## STDOUT:
67FOO
68hi
69## END
70## OK zsh STDOUT:
71FOO
72foo
73FOO
74hi
75## END
76
77#### status code is available
78
79shopt --set parse_at
80
81cat <(seq 2; exit 2) <(seq 3; exit 3)
82
83case $SH in bash|zsh) exit ;; esac
84
85echo status @_process_sub_status
86echo done
87
88## STDOUT:
891
902
911
922
933
94status 2 3
95done
96## END
97## N-I bash/zsh STDOUT:
981
992
1001
1012
1023
103## END
104
105#### shopt -s process_sub_fail
106
107case $SH in bash|zsh) exit ;; esac
108
109shopt --set parse_at
110
111cat <(echo a; exit 2) <(echo b; exit 3)
112echo status=$? ps @_process_sub_status
113
114echo __
115shopt -s process_sub_fail
116
117cat <(echo a; exit 2) <(echo b; exit 3)
118echo status=$? ps @_process_sub_status
119
120# Now exit because of it
121set -o errexit
122
123cat <(echo a; exit 2) <(echo b; exit 3)
124echo status=$? ps @_process_sub_status
125
126## status: 3
127## STDOUT:
128a
129b
130status=0 ps 2 3
131__
132a
133b
134status=3 ps 2 3
135a
136b
137## END
138## N-I bash/zsh status: 0
139## N-I bash/zsh STDOUT:
140## END
141
142#### process subs and pipelines together
143
144# zsh is very similar to bash, but don't bother with the assertions
145case $SH in bash|zsh) exit ;; esac
146
147shopt --set parse_at
148
149f() {
150 cat <(seq 1; exit 1) | {
151 cat <(seq 2; exit 2) <(seq 3; exit 3)
152
153 # 2022-11 workaround for race condition: sometimes we get pipeline=141 4
154 # instead of pipeline=0 4, which means that the first 'cat' got SIGPIPE.
155 # If we make this part of the pipeline take longer, then 'cat' should have
156 # a chance to finish.
157
158 sleep 0.01
159
160 (exit 4)
161 }
162 echo status=$?
163 echo process_sub @_process_sub_status
164 echo pipeline @_pipeline_status
165 echo __
166}
167
168f
169
170## STDOUT:
1711
1722
1731
1742
1753
176status=4
177process_sub 2 3
178pipeline 0 4
179__
180## END
181## N-I bash/zsh STDOUT:
182## END
183
184#### process sub in background &
185
186cat <(seq 3; sleep 0.1) & wait
187
188echo sync
189
190# This one escapes, and the shell should still exit
191cat <(sleep 0.1) &
192
193echo fork
194
195## STDOUT:
1961
1972
1983
199sync
200fork
201## END