scripts/eza

280 lines
7.3 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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