rely on shell recursion