SH_NAME="sh"
SH_SHELL="$(cat /proc/${$}/comm)"
export SH_SHELL

SH_ROOT="/etc/${SH_NAME}"
SH_USER="${HOME}/${SH_NAME}"

SH_MAIN="${SH_ROOT}/main.sh"

[ -n "${ENV}" ] || export ENV="${SH_MAIN}"

_sh_main_commands() {
	local file="${1}"
	grep "()" "${file}" |
		cut --delimiter "(" --fields 1
}

_sh_main_log() {
	case "${-}" in
	*i*)
		local argument
		for argument in "${@}"; do
			echo "${argument}"
		done
		;;
	*) ;;
	esac
}

main_source_directory() {
	local path="${1}"
	if [ -d "${path}" ]; then
		local cmd count ifs module modules
		modules="$(find "${path}" \
			-type "f" \
			-name "*.sh" \
			-printf "%P\n" |
			sort)"
		ifs="${IFS}"
		IFS="
"
		count=0
		_sh_main_log "" \
			". ${path}"
		for module in ${modules}; do
			count=$((count + 1))
			#printf "%02d" "${count}"
			_sh_main_log "${module%.sh}"
			module="${path}/${module}"
			if [ "${module}" != "${ENV}" ]; then
				. "${module}"
				cmd="$(_sh_main_commands "${module}")"
				if [ -n "${cmd}" ]; then
					[ -n "${CMD}" ] && CMD="${CMD}
"
					CMD="${CMD}${cmd}"
				fi
			fi
		done
		IFS="${ifs}"
	else
		_sh_main_log "Not a directory: ${path}"
		return 1
	fi
}

main_source_file() {
	local path="${1}"
	if [ -f "${path}" ]; then
		main_source_directory "$(dirname "${path}")"
	else
		_sh_main_log "Not a file: ${path}"
		return 1
	fi
}

_sh_main() {
	main_source_file "${ENV}"
	main_source_directory "${SH_USER}"
	_sh_main_log "" \
		"sh_… = shell functions" \
		"a__… = aliases" \
		"u__… = user"
}

_sh_main