#!/bin/false intersection() { comm -12 "$@" } difference() { comm -23 "$@" } extract_words() { grep -o -E '\b\w+\b' | sort -u } immediate_dependencies1() { intersection \ <(compgen -A function | sort -u) \ <(declare -f "$1" | extract_words) } immediate_dependencies() { (for f do immediate_dependencies1 "$f" done) | sort -u } recursive_dependencies() { local seen=() while [ $# -gt 0 ] do seen+=("$@") set -- $(difference <(immediate_dependencies "$@") \ <(printf '%s\n' "${seen[@]}" | sort -u)) done printf '%s\n' "${seen[@]}" }