1 #!/usr/bin/env bash
2
3 #### Process sub input
4 f=_tmp/process-sub.txt
5 { echo 1; echo 2; echo 3; } > $f
6 cat <(head -n 2 $f) <(tail -n 2 $f)
7 ## STDOUT:
8 1
9 2
10 2
11 3
12 ## END
13
14 #### Process sub output
15 { echo 1; echo 2; echo 3; } > >(tac)
16 ## STDOUT:
17 3
18 2
19 1
20 ## END
21
22 #### Non-linear pipeline with >()
23 stdout_stderr() {
24 echo o1
25 echo o2
26
27 sleep 0.1 # Does not change order
28
29 { echo e1;
30 echo warning: e2
31 echo e3;
32 } >& 2
33 }
34 stdout_stderr 2> >(grep warning) | tac >$TMP/out.txt
35 wait $! # this does nothing in bash 4.3, but probably does in bash 4.4.
36 echo OUT
37 cat $TMP/out.txt
38 # PROBLEM -- OUT comes first, and then 'warning: e2', and then 'o2 o1'. It
39 # looks like it's because nobody waits for the proc sub.
40 # http://lists.gnu.org/archive/html/help-bash/2017-06/msg00018.html
41 ## STDOUT:
42 OUT
43 warning: e2
44 o2
45 o1
46 ## END
47
48 #### $(<file) idiom with process sub
49 echo FOO >foo
50
51 # works in bash and zsh
52 echo $(<foo)
53
54 # this works in zsh, but not in bash
55 tr A-Z a-z < <(<foo)
56
57 cat < <(<foo; echo hi)
58
59 ## STDOUT:
60 FOO
61 hi
62 ## END
63 ## OK zsh STDOUT:
64 FOO
65 foo
66 FOO
67 hi
68 ## END