zmodload zsh/stat
typeset -gA zsv_fd_counts
local -A ftypes seen
local key fdlink fddest
zsv_fd_counts=( )
ftypes=( # convert hex type to a word
C socket
c socket
A link
a link
8 file
6 block
4 dir
2 char
1 pipe
)
for fdlink in "$@"; do
fddest=$(zstat -L +link $fdlink) || continue
(( $+seen[$fddest] )) && continue
case $fddest in
(/dev/null)
zsv_fd_counts[null]=$(( ${zsv_fd_counts[null]:-0} + 1 ))
;;
(/*)
zstat -H s $fdlink || continue
ftype=$(( [##16] $s[mode] >> 12 ))
key=$ftypes[$ftype]
zsv_fd_counts[$key]=$(( ${zsv_fd_counts[$key]:-0} + 1 ))
;;
(*)
key=${fddest%%:*}
zsv_fd_counts[$key]=$(( ${zsv_fd_counts[$key]:-0} + 1 ))
;;
esac
seen[$fddest]=1
done
# vim: fileencoding=utf-8 ft=zsh noet sw=4 ts=4 sts=4