OILS / demo / fd-state.sh View on Github | oilshell.org

62 lines, 26 significant
1#!/usr/bin/env bash
2#
3# Test the child process FD state of each shell.
4#
5# This used to be a spec test, but I found it wasn't consistent when running in
6# parallel under test/spec-runner.sh.
7#
8# Also see demo/fd-main.sh.
9#
10# Usage:
11# ./fd-state.sh <function name>
12
13set -o nounset
14set -o pipefail
15set -o errexit
16
17readonly SCRIPT=_tmp/list-fds.sh
18
19#### File Descriptor State is clean when running script
20count-fds() {
21 local sh=$1
22
23 # Run it and count output
24 $sh $SCRIPT _tmp/fd.txt
25 count=$(cat _tmp/fd.txt | wc -l)
26 echo "count=$count"
27
28 # bash and dash are very orderly: there are 3 pipes and then 10 or 255
29 # has the script.sh.
30 # mksh and zsh have /dev/tty saved as well. Not sure why.
31
32 # for debugging failures
33 if test "$count" -ne 4; then
34 cat _tmp/fd.txt >&2
35 fi
36 # stdout: count=4
37 # OK mksh/zsh stdout: count=5
38 # stdout-json: ""
39}
40
41main() {
42 # tail -n + 2: get rid of first line
43 cat >$SCRIPT <<'EOF'
44out=$1
45ls -l /proc/$$/fd | tail -n +2 > $out
46EOF
47
48 # TODO: Make assertions here for OSH.
49 for sh in bash dash mksh zsh bin/osh _bin/osh; do
50
51 echo
52 echo "=== $sh ==="
53 echo
54
55 if ! which $sh; then
56 continue
57 fi
58 count-fds $sh
59 done
60}
61
62main "$@"