|  | #!/bin/bash | 
|  |  | 
|  | # Universal bash program setup functions. | 
|  |  | 
|  | # Example usage: | 
|  |  | 
|  | # Source files to get required functions. | 
|  | # source_files="gen_setup.sh" | 
|  | # source_file_paths=$(type -p ${source_files}) | 
|  | # for file_path in ${source_file_paths} ; do source ${file_path} ; done | 
|  |  | 
|  | # Turn on extended globbing. | 
|  | shopt -s extglob | 
|  |  | 
|  |  | 
|  | function get_pgm_path_info { | 
|  | local program_path_var="${1:-program_path}" ; shift | 
|  | local program_name_var="${1:-program_name}" ; shift | 
|  | local program_dir_path_var="${1:-program_dir_path}" ; shift | 
|  | local follow_links="${1:-0}" ; shift | 
|  |  | 
|  | # Determine the program path, name and dir path and assign them to the variables indicated by the caller. | 
|  |  | 
|  | # Description of argument(s): | 
|  | # program_path_var                The name of the variable to receive the program path. | 
|  | # program_name_var                The name of the variable to receive the program name. | 
|  | # program_dir_path_var            The name of the variable to receive the program dir path. | 
|  | # follow_links                    If the program running is actually a link to another file, use that file | 
|  | #                                 when calculating the above values. | 
|  |  | 
|  | local _spn_loc_program_path_="${0}" | 
|  |  | 
|  | # The program name is the program path minus all characters up to and including the first slash. | 
|  | local _spn_loc_program_name_=${_spn_loc_program_path_##*/} | 
|  | # The program dir path is the program path minus everything from the last slash to the end of the string. | 
|  | local _spn_loc_program_dir_path_=${_spn_loc_program_path_%${_spn_loc_program_name_}} | 
|  |  | 
|  | # If program dir path does not start with a slash then it is relative.  Convert it to absolute. | 
|  | if [ "${_spn_loc_program_dir_path_:0:1}" != "/" ] ; then | 
|  | _spn_loc_program_dir_path_="$(readlink -f ${_spn_loc_program_dir_path_})/" | 
|  | # Re-assemble the parts into program path variable. | 
|  | _spn_loc_program_path_="${_spn_loc_program_dir_path_}${_spn_loc_program_name_}" | 
|  | fi | 
|  |  | 
|  | if (( follow_links )) ; then | 
|  | _spn_loc_program_path_=$(readlink -f ${_spn_loc_program_path_}) | 
|  | # Re-calculate program_name in case it is different now. | 
|  | _spn_loc_program_name_=${_spn_loc_program_path_##*/} | 
|  | fi | 
|  |  | 
|  | # Set caller's variables. | 
|  | cmd_buf="${program_path_var}=\"\${_spn_loc_program_path_}\" ; ${program_name_var}=\"\${_spn_loc_program_name_}\" ; ${program_dir_path_var}=\"\${_spn_loc_program_dir_path_}\"" | 
|  | eval "${cmd_buf}" | 
|  |  | 
|  | } |