Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Include script only once in shell script

Tags:

bash

shell

I would like to include files into a shell script as "support" scripts. Since they set things up and check the environment, I only want to let them be executed once.

My approach was to create a global array, check if the script name exists in that array. f it doesn't, add it to the array and "source" the external file.

The current code looks like this:

 function array_contains() { # array, value
    local element
    for element in $1; do
        [[ "$element" == "$2" ]] && return 0
    done

    return 1
}

declare -a LOADED_SUPPORT_SCRIPTS

function require_support() { # file
    # Check if we loaded the support already
    array_contains ${LOADED_SUPPORT_SCRIPTS[@]} $1 && return 0

    # Add loaded support to array
    LOADED_SUPPORT_SCRIPTS=("${LOADED_SUPPORT_SCRIPTS[@]}" "$1")

    log -i "Including support for '$1'"
    source "$BASE_DIR/supports/$1.sh"

    return 1
}

While this should work in theory (at least for me), this code just fails every single time. Somehow the array gets reset (even though I never access it somewhere else) and always contains a "/" entry in the beginning.

From further googling my problem I found this "solution" which needs a new variable name inside every script that I want to include - like C/C++ does. While this is indeed a good idea, i would like to keep my code as small as possible, I do not really care about the performance of array iterations.

I really would like to know if there is an alternative way, or what I did wrong in my code that could be fixed. Thanks in advance!

like image 288
spaceemotion Avatar asked Sep 04 '25 01:09

spaceemotion


1 Answers

Perhaps you can try using Shell Script Loader for that. See a post about it in a famous similar thread: https://stackoverflow.com/a/3692080/445221.

like image 95
konsolebox Avatar answered Sep 06 '25 16:09

konsolebox



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!