scripts/eza

280 lines
7.3 KiB
Plaintext
Raw Permalink Normal View History

#!/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