OILS / demo / fd-strace.sh View on Github | oils.pub

86 lines, 57 significant
1#!/usr/bin/env bash
2#
3# Usage:
4# ./fd-strace.sh <function name>
5
6set -o nounset
7set -o pipefail
8set -o errexit
9
10lines-to-remove() {
11 local sh=$1
12 case $sh in
13 dash) echo 5 ;;
14 */ash) echo 0 ;;
15 */osh) echo 24 ;;
16 *) echo 0 ;;
17 esac
18}
19
20readonly BASE_DIR=_tmp/fd-strace
21
22do-strace() {
23 local sh=$1
24 local fd=$2
25
26 local num_lines
27 num_lines=$(lines-to-remove $sh)
28
29 local fil
30 num_lines=$(lines-to-remove $sh)
31
32 echo ===
33 echo $sh
34 echo
35
36 local out
37 out=$BASE_DIR/$fd-$(basename $sh).txt
38
39 # PR adds lseek
40 strace \
41 -e open,openat,fcntl,dup2,close,lseek \
42 $sh demo/fd-number.sh $fd 2>&1 |
43 tail -n +$num_lines | tee $out
44 }
45
46compare() {
47 mkdir -p $BASE_DIR
48 rm -f -v $BASE_DIR/*
49
50 local osh=_bin/cxx-dbg/osh
51
52 ninja $osh
53
54 # dash can only handle descriptor 8
55 for sh in dash _tmp/shells/ash $osh; do
56 do-strace $sh 8
57 done
58
59 for sh in _tmp/shells/ash $osh; do
60 for fd in 10 12; do
61 do-strace $sh $fd
62 done
63 done
64
65 wc -l $BASE_DIR/*
66}
67
68side-by-side() {
69 # trick from Claude
70
71 printf '%-30s --- %s\n' $1 $2
72 pr --merge --omit-header $1 $2
73 #pr $1 $2
74}
75
76osh-ash() {
77 local fd=${1:-8}
78 side-by-side $BASE_DIR/$fd-{osh,ash}.txt
79}
80
81osh-dash() {
82 local fd=${1:-8}
83 side-by-side $BASE_DIR/$fd-{osh,dash}.txt
84}
85
86"$@"