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 |