280 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			280 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/bin/sh
 | ||
| #
 | ||
| # Purpose {{{
 | ||
| # This script will try to start eza
 | ||
| #   1. installed on the system if available
 | ||
| #   2. from a symlink in user's PATH
 | ||
| #
 | ||
| # 2023-09-16
 | ||
| # }}}
 | ||
| # Flags {{{
 | ||
| ## Exit on error {{{
 | ||
| set -o errexit
 | ||
| ## }}}
 | ||
| ## Exit on unset var {{{
 | ||
| ### Use "${VARNAME-}" to test a var that may not have been set
 | ||
| set -o nounset
 | ||
| ## }}}
 | ||
| ## Pipeline command is treated as failed {{{
 | ||
| ### Not available in POSIX sh − https://github.com/koalaman/shellcheck/wiki/SC3040
 | ||
| #set -o pipefail
 | ||
| ## }}}
 | ||
| ## Help with debugging {{{
 | ||
| ### Call the script by prefixing it with "TRACE=1 ./script.sh"
 | ||
| if [ "${TRACE-0}" -eq 1 ]; then set -o xtrace; fi
 | ||
| ## }}}
 | ||
| # }}}
 | ||
| # Vars {{{
 | ||
| PROGNAME=$(basename "${0}"); readonly PROGNAME
 | ||
| PROGDIR=$(readlink --canonicalize-missing $(dirname "${0}")); readonly PROGDIR
 | ||
| ARGS="${*}"; readonly ARGS
 | ||
| readonly NBARGS="${#}"
 | ||
| [ -z "${DEBUG-}" ] && DEBUG=1
 | ||
| ## Export DEBUG for sub-script
 | ||
| export DEBUG
 | ||
| 
 | ||
| ## Default values for some vars
 | ||
| readonly EZA_SYSTEM_PATH="/bin/eza"
 | ||
| readonly EZA_USER_PATH="${HOME}/bin/eza.link"
 | ||
| 
 | ||
| ## Colors
 | ||
| readonly PURPLE='\033[1;35m'
 | ||
| readonly RED='\033[0;31m'
 | ||
| readonly RESET='\033[0m'
 | ||
| readonly COLOR_DEBUG="${PURPLE}"
 | ||
| # }}}
 | ||
| usage() {                                                       # {{{
 | ||
| 
 | ||
| 	cat <<- HELP
 | ||
| usage: $PROGNAME [--debug|help|--user|--system]
 | ||
| 
 | ||
| Tiny script to start existing eza (from the system or from user's PATH)
 | ||
| 
 | ||
| EXAMPLES :
 | ||
|     - Start eza
 | ||
|         ${PROGNAME}
 | ||
| 
 | ||
|     - Set different binary for user
 | ||
|         ${PROGNAME} --user "${HOME}/bin/my.eza"
 | ||
| 
 | ||
| OPTIONS :
 | ||
|     --debug
 | ||
|         Enable debug messages.
 | ||
| 
 | ||
|     help
 | ||
|         Print this help message.
 | ||
| 
 | ||
|     --user
 | ||
|         Change the user's binary to use.
 | ||
|         (default: ${EZA_USER_PATH})
 | ||
| 
 | ||
|     --system
 | ||
|         Change the system's binary to use.
 | ||
|         (default: ${EZA_SYSTEM_PATH})
 | ||
| 
 | ||
|     ALL OTHER OPTIONS WILL BE PASSED AS EZA's OPTIONS
 | ||
| HELP
 | ||
| }
 | ||
| # }}}
 | ||
| debug_message() {                                               # {{{
 | ||
| 
 | ||
| 	local_debug_message="${1}"
 | ||
| 
 | ||
| 	## Print message if DEBUG is enable (=0)
 | ||
| 	[ "${DEBUG}" -eq "0" ] && printf '\e[1;35m%-6b\e[m\n' "DEBUG − ${PROGNAME} : ${local_debug_message}"
 | ||
| 
 | ||
| 	unset local_debug_message
 | ||
| 
 | ||
| 	return 0
 | ||
| }
 | ||
| # }}}
 | ||
| error_message() {                                               # {{{
 | ||
| 
 | ||
| 	local_error_message="${1}"
 | ||
| 	local_error_code="${2}"
 | ||
| 
 | ||
| 	## Print message
 | ||
| 	printf '%b\n' "ERROR − ${PROGNAME} : ${RED}${local_error_message}${RESET}" >&2
 | ||
| 
 | ||
| 	unset local_error_message
 | ||
| 
 | ||
| 	exit "${local_error_code:=66}"
 | ||
| }
 | ||
| # }}}
 | ||
| define_vars() {                                                 # {{{
 | ||
| 
 | ||
| 	# If eza_system_path wasn't defined (argument) {{{
 | ||
| 	if [ -z "${eza_system_path-}" ]; then
 | ||
| 		## Use default value
 | ||
| 		readonly eza_system_path="${EZA_SYSTEM_PATH}"
 | ||
| 	fi
 | ||
| 	# }}}
 | ||
| 	# If eza_user_path wasn't defined (argument) {{{
 | ||
| 	if [ -z "${eza_user_path-}" ]; then
 | ||
| 		## Use default value
 | ||
| 		readonly eza_user_path="${EZA_USER_PATH}"
 | ||
| 	fi
 | ||
| 	# }}}
 | ||
| 
 | ||
| }
 | ||
| # }}}
 | ||
| 
 | ||
| is_bin_present() {                                             # {{{
 | ||
| 
 | ||
| 	local_bin_present="${1}"
 | ||
| 	debug_prefix="${2:-}"
 | ||
| 
 | ||
| 	## File doesn't exist by default
 | ||
| 	return_is_bin_present="1"
 | ||
| 
 | ||
| 	### Check if the file exists with executable perm
 | ||
| 	# shellcheck disable=SC2086
 | ||
| 	if find ${local_bin_present} -perm -a+x > /dev/null 2>&1; then
 | ||
| 		return_is_bin_present="0"
 | ||
| 		debug_message "${debug_prefix}is_bin_present − \
 | ||
| The file ${RED}${local_bin_present}${COLOR_DEBUG} exists."
 | ||
| 	else
 | ||
| 		return_is_bin_present="1"
 | ||
| 		debug_message "${debug_prefix}is_bin_present − \
 | ||
| The file ${RED}${local_bin_present}${COLOR_DEBUG} doesn't exist."
 | ||
| 	fi
 | ||
| 
 | ||
| 	unset local_bin_present="${1}"
 | ||
| 	unset debug_prefix
 | ||
| 
 | ||
| 	return "${return_is_bin_present}"
 | ||
| }
 | ||
| # }}}
 | ||
| 
 | ||
| main() {                                                        # {{{
 | ||
| 
 | ||
| 	debug_message "--- MAIN BEGIN"
 | ||
| 
 | ||
| 	## Define all vars
 | ||
| 	define_vars
 | ||
| 	debug_message "| Define vars"
 | ||
| 
 | ||
| 	## If eza system is available {{{
 | ||
| 	### Start it
 | ||
| 	if is_bin_present "${eza_system_path}" "| "; then
 | ||
| 		### If EZA_OPTIONS is defined, call eza with options {{{
 | ||
| 		if [ -n "${EZA_OPTIONS-}" ]; then
 | ||
| 			debug_message "Use Eza from system (${eza_system_path}) with options (${EZA_OPTIONS})."
 | ||
| 			"${eza_system_path}" $(echo "${EZA_OPTIONS}") \
 | ||
| 				|| error_message "Error while calling eza from system path (${eza_system_path})" 11
 | ||
| 		### }}}
 | ||
| 		### If EZA_OPTIONS is NOT defined simply call it {{{
 | ||
| 		elif [ -z "${EZA_OPTIONS-}" ]; then
 | ||
| 			debug_message "Use Eza from system (${eza_system_path}) without options."
 | ||
| 			"${eza_system_path}" \
 | ||
| 				|| error_message "Error while calling eza from system path (${eza_system_path})" 12
 | ||
| 		### }}}
 | ||
| 		### If anything else happens, exit with error {{{
 | ||
| 		else
 | ||
| 			error_message "This test case is not supposed to happen ! Variable EZA_OPTIONS is defined or not." 13
 | ||
| 		fi
 | ||
| 		### }}}
 | ||
| 		debug_message "--- MAIN END"
 | ||
| 		exit 0
 | ||
| 	fi
 | ||
| 	## }}}
 | ||
|   ## If eza from user path is available {{{
 | ||
| 	if is_bin_present "${eza_user_path}" "| "; then
 | ||
| 		### If EZA_OPTIONS is defined, call eza with options {{{
 | ||
| 		if [ -n "${EZA_OPTIONS-}" ]; then
 | ||
| 			debug_message "Use Eza from user's path (${eza_user_path}) with options (${EZA_OPTIONS})."
 | ||
| 			"${eza_user_path}" $(echo "${EZA_OPTIONS}") \
 | ||
| 				|| error_message "Error while calling eza from system path (${eza_user_path})" 21
 | ||
| 		### }}}
 | ||
| 		### If EZA_OPTIONS is NOT defined simply call it {{{
 | ||
| 		elif [ -z "${EZA_OPTIONS-}" ]; then
 | ||
| 			debug_message "Use Eza from user's path (${eza_user_path}) without options."
 | ||
| 			"${eza_user_path}" \
 | ||
| 				|| error_message "Error while calling eza from user path (${eza_user_path})" 22
 | ||
| 		### }}}
 | ||
| 		### If anything else happens, exit with error {{{
 | ||
| 		else
 | ||
| 			error_message "This test case is not supposed to happen ! Variable EZA_OPTIONS is defined or not." 23
 | ||
| 		fi
 | ||
| 		### }}}
 | ||
| 		debug_message "--- MAIN END"
 | ||
| 		exit 0
 | ||
| 	fi
 | ||
|   ## }}}
 | ||
| 
 | ||
| 	debug_message "--- MAIN END"
 | ||
| }
 | ||
| # }}}
 | ||
| 
 | ||
| # Manage arguments                                                # {{{
 | ||
| # This code can't be in a function due to argument management
 | ||
| 
 | ||
| if [ ! "${NBARGS}" -eq "0" ]; then
 | ||
| 
 | ||
| 	manage_arg="0"
 | ||
| 
 | ||
| 	## If the first argument ask for help (h|help) {{{
 | ||
| 	if printf -- '%s' "${1-}" | grep --quiet --extended-regexp -- "^h(elp)?$"; then
 | ||
| 		usage
 | ||
| 		exit 0
 | ||
| 	fi
 | ||
| 	## }}}
 | ||
| 
 | ||
| 	## If the first argument is not an option
 | ||
| 	if ! printf -- '%s' "${1}" | grep --quiet --extended-regexp -- "^-+";
 | ||
| 	then
 | ||
| 		## Print help message and exit
 | ||
| 		printf '%b\n' "${RED}Invalid option: ${1}${RESET}"
 | ||
| 		printf '%b\n' "---"
 | ||
| 		usage
 | ||
| 
 | ||
| 		exit 1
 | ||
| 	fi
 | ||
| 
 | ||
| 	# Parse all options (start with a "-") one by one
 | ||
| 	while printf -- '%s' "${1-}" | grep --quiet --extended-regexp -- "^-+"; do
 | ||
| 
 | ||
| 		case "${1}" in
 | ||
| 			--debug )                             ## debug
 | ||
| 				DEBUG=0
 | ||
| 				debug_message "--- Manage argument BEGIN"
 | ||
| 				;;
 | ||
| 			--user )                              ## Define eza_user_path with given arg
 | ||
| 				## Move to the next argument
 | ||
| 				shift
 | ||
| 				## Define var
 | ||
| 				readonly eza_user_path="${1}"
 | ||
| 				;;
 | ||
| 			--system )                            ## Define eza_system_path with given arg
 | ||
| 				## Move to the next argument
 | ||
| 				shift
 | ||
| 				## Define var
 | ||
| 				readonly eza_system_path="${1}"
 | ||
| 				;;
 | ||
| 			* )                                   ## unknow option
 | ||
| 				debug_message "Unknown option (${1}), pass it as eza's option"
 | ||
| 				test -n "${EZA_OPTIONS-}" && EZA_OPTIONS="${EZA_OPTIONS} ${1}"
 | ||
| 				test -z "${EZA_OPTIONS-}" && EZA_OPTIONS="${1}"
 | ||
| 				;;
 | ||
| 		esac
 | ||
| 
 | ||
| 		debug_message "| ${RED}${1}${COLOR_DEBUG} option managed."
 | ||
| 
 | ||
| 	## Move to the next argument
 | ||
| 	shift
 | ||
| 	manage_arg=$((manage_arg+1))
 | ||
| 
 | ||
| done
 | ||
| 
 | ||
| debug_message "| ${RED}${manage_arg}${COLOR_DEBUG} argument(s) successfully managed."
 | ||
| else
 | ||
| 	debug_message "| No arguments/options to manage."
 | ||
| fi
 | ||
| 
 | ||
| debug_message "--- Manage argument END"
 | ||
| # }}}
 | ||
| 
 | ||
| main
 | ||
| 
 | ||
| exit 255
 |