Setting up system wide bash functions for every users.

Hello.

I have a bash script that contains 52 function definitions like :

#
.............
....
function date2stamp_full2  {
#    "2016-11-27__14h15m02s"
    date --date "$1" +%Y-%m-%d__%Hh%Mm%Ss
}

#
# ++++++++++++++++++++++++++++++++++++++++++++
#
# Yes or not
#
# ++++++++++++++++++++++++++++++++++++++++++++
#
function yes_or_not {
#
    local L_REPLY="" L_PARAM1=" "
#
    if  $# -gt 0 ]] ; then
        L_PARAM1="$1"
    fi
#
    read -r -p "$L_PARAM1" L_REPLY
    case $L_REPLY in
        [yY][eE][sS])
            echo
            return $ANSW_Yes        # ANSW_Yes=1
            ;;
        [yY])
            echo
            return $ANSW_Y            # ANSW_Y=1 
            ;;
        *)
            if  $MY_DEBUG -ne 0 ]] ; then
                echo "  -->> Reject ..."
            fi
            echo
            return $ANSW_not_yes    # 2 -- ANSWER ANYTHINGS but not [yYeEsS] or Yy
            ;;
    esac
    echo
    return $E_BAD_LOGIC
}

.............
....

The script ends with the export of the functions like :

export -f array_contains_element ask_YyRr ask_Yy_Y ask_YyYy confirm_twice copy_link_to_dest create_encrypted_password create_my_directory_user create_user date2stamp_2 date2stamp2 date2stamp date2stamp_full2 date2stamp_full deactivate_all_repo debug_stop_or_continue download_http_link flag_debug_msg get_config_param_string get_config_param_val get_config_param_val_in_section get_last_word_from_string get_my_error_name get_operator_input2 get_operator_input get_string_length http_link_exists install_new_app_one_by_one main_repositories_exists make_bash_local make_main_directory_backup message_begin_script message_debug message_end_script message_error message_header message_informal message_success move_downloaded_file my_get_salt print_array_full  print_array_if_debug_on print_if_debug_on print_var print_var_to_file return_new_version_file search_after_token stop_or_continue trim_quote_in_string trim_string yes_or_not_confirm yes_or_not
#

The bash script is sourced from /etc/profile.local.

When I test if all functions has been exported I found that 12 were missing ( those whose name are at the beginning of a line) :

~> env | grep BASH_ | sort
        BASH_FUNC_array_contains_element%%=() {  local e;
        BASH_FUNC_ask_YyRr%%=() {  local L_REPLY="" L_PARAM1=" ";
        BASH_FUNC_ask_Yy_Y%%=() {  local L_REPLY="" L_PARAM1=" ";
        BASH_FUNC_ask_YyYy%%=() {  local L_REPLY="" L_PARAM1=" ";
        BASH_FUNC_confirm_twice%%=() {  local L_CUR_DATE;
        BASH_FUNC_copy_link_to_dest%%=() {  local L_NUM_ARG=0;
        BASH_FUNC_create_encrypted_password%%=() {  local -i L_LEN_SALT=0 L_OFFSET=0 L_FLAG=1;
        BASH_FUNC_create_my_directory_user%%=() {  local l_user_home_flag="$1";
        BASH_FUNC_create_user%%=() {  declare -i L_ERREUR_CODE=0;
        BASH_FUNC_date2stamp_2%%=() {  date --date "$1" +%Y_%m_%d
        BASH_FUNC_date2stamp2%%=() {  date --date "$1" +%Y_%m_%d__%Hh%M
        BASH_FUNC_date2stamp%%=() {  date --date "$1" +%Y-%m-%d
        BASH_FUNC_date2stamp_full%%=() {  date --date "$1" +%Y-%m-%d__%H-%M-%S
date2stamp_full2
        BASH_FUNC_deactivate_all_repo%%=() {  local -a L_ARRAY_LIST_CURRENT_REPO;
        BASH_FUNC_debug_stop_or_continue%%=() {  local L_REPLY="" L_PARAM1=" " L_CAT_FILE1=" " L_CAT_FILE2=" ";
download_http_link
        BASH_FUNC_flag_debug_msg%%=() {  local L_REPLY="" L_FLAG=" ";
        BASH_FUNC_get_config_param_string%%=() {  local FILE_NAME=" ";
        BASH_FUNC_get_config_param_val%%=() {  delare -i L_DEBUG;
        BASH_FUNC_get_config_param_val_in_section%%=() {  local -i L_DEBUG L_RETURN_CODE=0;
        BASH_FUNC_get_last_word_from_string%%=() {  local LOCAL_STRING="";
        BASH_FUNC_get_my_error_name%%=() {  local __resultvar=$1;
get_operator_input
get_operator_input2
get_string_length
        BASH_FUNC_http_link_exists%%=() {  local L_ERR_CODE=0;
        BASH_FUNC_install_new_app_one_by_one%%=() {  local -a L_ARRAY;
        BASH_FUNC_main_repositories_exists%%=() {  local -a L_ARRAY_MAIN_REPOS;
make_bash_local
        BASH_FUNC_make_main_directory_backup%%=() {  local L_CUR_DATE;
        BASH_FUNC_message_begin_script%%=() {  local -a L_ARRAY;
        BASH_FUNC_message_debug%%=() {  local -a L_ARRAY;
        BASH_FUNC_message_end_script%%=() {  local -a L_ARRAY;
        BASH_FUNC_message_error%%=() {  local -a L_ARRAY;
        BASH_FUNC_message_header%%=() {  local -a L_ARRAY;
message_informal
        BASH_FUNC_message_success%%=() {  local -a L_ARRAY;
        BASH_FUNC_move_downloaded_file%%=() {  local L_SRC_FILE=" ";
        BASH_FUNC_my_get_salt%%=() {  date --date "$1" +%s%N
        BASH_FUNC_print_array_full%%=() {  local -i L_NB_ELEMENT;
        BASH_FUNC_print_array_if_debug_on%%=() {  local -i L_DEBUG=0;
        BASH_FUNC_print_if_debug_on%%=() {  local -i L_DEBUG;
print_var
print_var_to_file
return_new_version_file
        BASH_FUNC_search_after_token%%=() {  local CMD=" ";
        BASH_FUNC_stop_or_continue%%=() {  local L_REPLY="" L_PARAM1=" ";
        BASH_FUNC_trim_quote_in_string%%=() {  sed 's/^"*//;s/"*$//'
        BASH_FUNC_trim_string%%=() {  sed 's/^ *//;s/ *$//'
yes_or_not
yes_or_not_confirm

For testing I added another bash script with the missing functions.
Then I added one more source command in /etc/profile.local to source the new script.
Only one more function were exported from /etc/profile.

If I open a terminal (konsole) and then source either the full functions script or the complementary functions script, the missing functions are exported.

Any help is welcome

the file ~/.profile is read during the log in process.
In this file, I test if one missing function exits using :

tf=$(type -t print_var_to_file 2>/dev/null || rt=$?)
if  "$tf" == "function" ]]; then
    MY_LOGGER "~/.profile - FUNCTION : 'print_var_to_file' is exported"
else
    MY_LOGGER "~/.profile must source   /backup_sys/000_COMMON/Bin/system_common_function"
fi

Reading systemd journal I can read :

mai 28 18:24:40 LINUX JCD_HOME_USER_PROFILE[2432]: hBc  -  ~/.profile - FUNCTION : 'print_var_to_file' is exported  - USER :  superjc

But after log in is finished if I open a terminal the missing functions still have disappear.

  1. If you’re referring to the actual “source” command,
    You shouldn’t be inserting that into a profile.local, the “source” command is only used to activate changes in profile (including profile.local) without having to reboot.
  2. If you’re inserting something very large and might run into buffer issues, an alternative to inserting in a profile.local is to place the individual scriptlets (instead of one big script) in different files in /etc/profile.d/. So, for instance a big clue to whether you’re encountering some kind of buffer problem is if your missing commands are all at the end of what you are trying to append.

TSU

Hello.
I have found that the function showed below is the reason of my trouble.
It seems that the way it is written is not compatible when sourcing.

It is this function that creates disorder and must be re-written:

If called without argument then print to screen, else print to the file passed in argument.


#
#+++++++++++++++++++++++++++++++++++++++++++++
#
# print_var
#
# ++++++++++++++++++++++++++++++++++++++++++++
#
function print_var {

#set -x

    local -i PRINT_TO_FILE=0

    TIMESTAMP=$(date2stamp2 now)
    if  $# -gt 0 ]] ; then
        LOG_FILE="$1"
        PRINT_TO_FILE=1
        REDIRECTION1=" > $LOG_FILE"
        REDIRECTION2=" >> $LOG_FILE"
    else
        unset LOG_FILE
        unset REDIRECTION1
        unset REDIRECTION2
    fi

    CMD="echo \"SYSTEM COMMON SERVER ENV VAR by user $USER @ $TIMESTAMP\"            $REDIRECTION1"
    eval "$CMD"
    CMD="echo \"MY_HARDWARE                  : $MY_HARDWARE\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"  \"  $REDIRECTION2"
    eval "$CMD"
    CMD="echo  \"  \" $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"CUR_TASK                     : $CUR_TASK\"            $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"SYS_BCKUP_DIR                : $SYS_BCKUP_DIR\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"ROOT_DIR                     : $ROOT_DIR\"            $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"SYS_COMMON_NDIR              : $SYS_COMMON_NDIR\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"SYS_COMMON_DIR               : $SYS_COMMON_DIR\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"SOFTWARE_NDIR                : $SOFTWARE_NDIR\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"SOFTWARE_DIR                 : $SOFTWARE_DIR\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"HARDWARE_DIR                 : $HARDWARE_DIR\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"CONFIG_LNX                   : $CONFIG_LNX\"            $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"CONFIG_USR                   : $CONFIG_USR\"            $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"BACKUP_SYS_INSTALL_PATH      : $BACKUP_SYS_INSTALL_PATH\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"ROOT_CURRENT_INSTALL_DIR     : $ROOT_CURRENT_INSTALL_DIR\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"SRC_DIR                      : $SRC_DIR\"                $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"LOCAL_REP                    : $LOCAL_REP\"            $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"LOGS_REP                     : $LOGS_REP\"            $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"CONFIG_APP                   : $CONFIG_APP\"            $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"ROUTER_REP                   : $ROUTER_REP\"            $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"SYS_ROUTER_SCRIPT_DIR        : $SYS_ROUTER_SCRIPT_DIR\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"USR_FIREFOX_DIR              : $USR_FIREFOX_DIR\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"USR_SCRIPT_DIR               : $USR_SCRIPT_DIR\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"SYS_SCRIPT_DIR1              : $SYS_SCRIPT_DIR1\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"SYS_SCRIPT_DIR2              : $SYS_SCRIPT_DIR2\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"PUB_FOLDERS                  : $PUB_FOLDERS\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"DISK_DEVICE_LIST             : $DISK_DEVICE_LIST\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"MY_DIR_LIST_DIR              : $MY_DIR_LIST_DIR\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"BROTHER_INSTALLER            : $BROTHER_INSTALLER\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"SAMSUNG_INSTALLER            : $SAMSUNG_INSTALLER\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"SCANNER_INSTALLER            : $SCANNER_INSTALLER\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"MY_CA_PATH                   : $MY_CA_PATH\"            $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"GENERAL_USERS                : $GENERAL_USERS\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"DB_MAIN_DIR                  : $DB_MAIN_DIR\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"GENERAL_DOWNLOAD_DIR         : $GENERAL_DOWNLOAD_DIR\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"MY_SERVER_IP                 : $MY_SERVER_IP\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"MY_SERVER_DOMAIN_NAME        : $MY_SERVER_DOMAIN_NAME\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"MY_SERVER_HOSTNAME           : $MY_SERVER_HOSTNAME\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"MY_OPENSUSE_NAME             : $MY_OPENSUSE_NAME\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"MY_OPENSUSE_VERSION_ID       : $MY_OPENSUSE_VERSION_ID\" $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"MY_KERNEL_VERSION            : $MY_KERNEL_VERSION\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"INSTALL_REPOS                : $INSTALL_REPOS\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"LEAP_VERSION                 : $LEAP_VERSION\"        $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"ARRAY_MAIN_REPO_LEAP         : ${ARRAY_MAIN_REPO_LEAP@]}\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"ARRAY_DISABLED_REPO_LEAP     : ${ARRAY_DISABLED_REPO_LEAP@]}\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"ARRAY_MY_OPENSUSE_REPO_LEAP  : ${ARRAY_MY_OPENSUSE_REPO_LEAP@]}\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"ARRAY_LIST_PREFERED_MY_REPO  : ${ARRAY_LIST_PREFERED_MY_REPO@]}\"    $REDIRECTION2"
    eval "$CMD"
    CMD="echo \"SYSTEM_COMMON_SERVER_ENV_VAR_EXPORT  : $SYSTEM_COMMON_SERVER_ENV_VAR_EXPORT\"    $REDIRECTION2"
    eval "$CMD"

#set +x

}

export -f print_var


Any help to rewrite that function is welcome.

Solved.

remove

eval “$CMD”

just replace any line like :

CMD="echo \"SYSTEM COMMON SERVER ENV VAR by user $USER @ $TIMESTAMP\"            "$REDIRECTION"
eval "$CMD"

by

echo "SYSTEM COMMON SERVER ENV VAR by user $USER @ $TIMESTAMP"            "$REDIRECTION"

It is exactly what I try. I want that all my functions defined for every user ( and/or script run through ssh from another computer )

I have a try

Recommend you look at how others install bash extensions.
A good source for this kind of stuff is Github.

Some examples

https://github.com/Bash-it/bash-it
A very big framework containing numerous function extensions and themes
Modifies .bashrc

https://github.com/scop/bash-completion
Install bash-completion
Writes to the /etc/profile.d/ directory. Although normally not much different than writing to a profile.local, this method instead encourages the use of smaller scripts, each script in its own text file. Perhaps better organization since all the individual scripts can be placed in this one directory.

I’ve been following your advice. But it does not help.
This general question led me to open a thread on a particular case that comes up to me.

At this point I think it is better to continue the conversation on this thread:
https://forums.opensuse.org/showthread.php/525938-sourcing-a-script-run-into-problem-when-size-is-too-big

Any way, thank you for your help

I will read this.
Thank you.