move environment functions to env module from file module and helpers module
feat env_subs_file and support functions now operational added shell_run function to module.lib so scripts can be run with the otherwise not loaded current shell added remove empty lines function to helpersmaster
parent
45a936d65f
commit
96127ca89f
2
load.sh
2
load.sh
|
@ -49,7 +49,7 @@ load_shell_host_user_dev () {
|
||||||
load_shell_dev
|
load_shell_dev
|
||||||
}
|
}
|
||||||
|
|
||||||
### START LOAD SCRIPT #####
|
###################### START LOAD SCRIPT #############################
|
||||||
|
|
||||||
load_custom_shell_env
|
load_custom_shell_env
|
||||||
|
|
||||||
|
|
13
module.lib
13
module.lib
|
@ -1,6 +1,8 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# echo loading module library
|
# echo loading module library
|
||||||
|
|
||||||
|
# source with set -a and set +a to have these bootstrap functions available in the environment
|
||||||
|
|
||||||
module_confirm() {
|
module_confirm() {
|
||||||
|
|
||||||
local FILE
|
local FILE
|
||||||
|
@ -55,7 +57,7 @@ fi
|
||||||
|
|
||||||
# BASH_SHELL_DIRS holds shell directories to search for modules. If will be searched
|
# BASH_SHELL_DIRS holds shell directories to search for modules. If will be searched
|
||||||
# in revsere order, user or network repos over host over base
|
# in revsere order, user or network repos over host over base
|
||||||
DIRS=( ${BASH_SHELL_DIRS:-$BASH_SHELL_BASE} )
|
DIRS=( ${BASH_SHELL_DIRS:-$BASH_SHELL_BASE} ${BASH_SHELL_NETWORKS_LOADED} )
|
||||||
[ -d BASH_SHELL_USER_DIR ] && DIRS=("${DIRS[@]}" "BASH_SHELL_USER_DIR")
|
[ -d BASH_SHELL_USER_DIR ] && DIRS=("${DIRS[@]}" "BASH_SHELL_USER_DIR")
|
||||||
[ -d $BASH_SHELL_DEV ] && DIRS=("${DIRS[@]}" "$BASH_SHELL_DEV")
|
[ -d $BASH_SHELL_DEV ] && DIRS=("${DIRS[@]}" "$BASH_SHELL_DEV")
|
||||||
|
|
||||||
|
@ -126,7 +128,14 @@ module_loaded() {
|
||||||
return $ret
|
return $ret
|
||||||
}
|
}
|
||||||
|
|
||||||
# exported for login environment
|
# put here so it's globally available
|
||||||
|
# runs a script but loads the current interactive shell environment, not recommended unless there is a need
|
||||||
|
# mostly for testing. Better to source some part of the shell as needed using shell-process-directory module
|
||||||
|
shell_run () {
|
||||||
|
bash -ci ". ${1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# can one off export a function
|
||||||
# declare -f -x module_load
|
# declare -f -x module_load
|
||||||
# declare -f -x module_find
|
# declare -f -x module_find
|
||||||
# declare -f -x module_confirm
|
# declare -f -x module_confirm
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
# to be sourced (below) not run in subshell!
|
|
||||||
function network_dirs () {
|
|
||||||
|
|
||||||
(return 0 2>/dev/null) || (echo network_dirs must be sourced; return 1)
|
|
||||||
|
|
||||||
module_load path
|
|
||||||
[[ $? -ne 0 ]] && echo unable to access the file module, aboarting load && return 1
|
|
||||||
|
|
||||||
|
|
||||||
local network
|
|
||||||
[[ ! -f $1 ]] && return
|
|
||||||
|
|
||||||
while read -r network || [ -n "$network" ]
|
|
||||||
do
|
|
||||||
if [[ ${network} = *!* ]]; then
|
|
||||||
network=${network/!/}
|
|
||||||
NETWORK_HOME=$network
|
|
||||||
fi
|
|
||||||
[[ $2 ]] && network=$2/$network
|
|
||||||
if [[ $(isAbsPath $network) ]]; then
|
|
||||||
[[ ! -d $network ]] && continue
|
|
||||||
else
|
|
||||||
if [[ -d ${BASH_SHELL_USER}/${network} ]];then
|
|
||||||
network=${BASH_SHELL_USER}/${network}
|
|
||||||
else
|
|
||||||
if [[ -d ${BASH_NETWORKS_DIR}/${network} ]];then
|
|
||||||
network=${BASH_NETWORKS_DIR}/${network}
|
|
||||||
else
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
[[ $network =~ $NETWORK_HOME ]] && NETWORK_HOME_DIR=${network}
|
|
||||||
BASH_SHELL_NETWORK_DIRS+="${network} "
|
|
||||||
BASH_SHELL_DIRS+="${network} "
|
|
||||||
done < "$1"
|
|
||||||
export NETWORK_HOME
|
|
||||||
export NETWORK_HOME_DIR
|
|
||||||
export BASH_SHELL_NETWORK_DIRS
|
|
||||||
}
|
|
|
@ -60,16 +60,19 @@ parse_option () {
|
||||||
[[ $f ]] && echo "$2 $ret" || echo $ret
|
[[ $f ]] && echo "$2 $ret" || echo $ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
remove_empty_lines () {
|
||||||
|
if [[ -f $1 ]]; then cat $1; else echo "$1"; fi | sed -rz 's/^\n+//; s/\n+$/\n/g'
|
||||||
|
}
|
||||||
|
|
||||||
remove_end_spaces () {
|
remove_end_spaces () {
|
||||||
del=${2:-\'}
|
del=${2:-\'}
|
||||||
# echo delimiter: $del
|
# echo delimiter: $del
|
||||||
# sed -e "s/[[:space:]]\{1,\}$del/$del/" <<< "$1"
|
# sed -e "s/[[:space:]]\{1,\}$del/$del/" <<< "$1"
|
||||||
res=$(sed -e "s/^$del[[:space:]]*/$del/" <<< "$1")
|
res=$(sed -e "s/^$del[[:space:]]*/$del/" <<< "$1")
|
||||||
# echo leading: $res
|
|
||||||
sed -e "s/[[:space:]]*${del}$/$del/" <<< "$res"
|
sed -e "s/[[:space:]]*${del}$/$del/" <<< "$res"
|
||||||
}
|
}
|
||||||
|
|
||||||
# pass any sed ' ' string and command lines will be ignored
|
# pass any sed ' ' string and comments lines will be ignored
|
||||||
# https://unix.stackexchange.com/a/301432/201387
|
# https://unix.stackexchange.com/a/301432/201387
|
||||||
# https://stackoverflow.com/a/35874420/4695378
|
# https://stackoverflow.com/a/35874420/4695378
|
||||||
sed_ignore_comments () {
|
sed_ignore_comments () {
|
||||||
|
@ -80,48 +83,3 @@ sed_ignore_comments () {
|
||||||
eval $cmd < /dev/stdin
|
eval $cmd < /dev/stdin
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# https://stackoverflow.com/questions/19331497/set-environment-variables-from-file-of-key-value-pairs
|
|
||||||
env_file () {
|
|
||||||
env=${1:-.env}
|
|
||||||
[[ -f "${env}" ]] && { echo $env; return 0; } # || echo not $env
|
|
||||||
[[ -f "${env}.env" ]] && { echo "${env}.env"; return 0; } # || echo not ${env}.env
|
|
||||||
[[ -f "${env}/.env" ]] && { echo "${env}/.env"; return 0; } # || echo not ${env}/.env
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# ignore non assignment lines
|
|
||||||
list_env_file_vars () {
|
|
||||||
env=$(env_file $1)
|
|
||||||
[[ ! $env ]] && { iecho "Env file ${1} doesn't exist"; return 1; }
|
|
||||||
echo $(grep -v '^#' ${env} | sed -n -E 's/(.*)=[^ =].*/\1/p' | xargs)
|
|
||||||
}
|
|
||||||
|
|
||||||
list_env_file_vals() {
|
|
||||||
vars=$(list_env_file_vars $1)
|
|
||||||
[[ $? -gt 0 ]] && return 1
|
|
||||||
for var in $(list_env_file_vars $1) ;
|
|
||||||
do
|
|
||||||
echo "$var=${!var}"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
source_env_file() {
|
|
||||||
env=$(env_file $1)
|
|
||||||
[[ ! $env ]] && { iecho "Env file ${1} doesn't exist"; return 1; }
|
|
||||||
source $env
|
|
||||||
}
|
|
||||||
|
|
||||||
export_env_file () {
|
|
||||||
env=$(env_file $1)
|
|
||||||
[[ ! $env ]] && { iecho "Env file ${1} doesn't exist"; return 1; }
|
|
||||||
set -a; source $env; set +a
|
|
||||||
}
|
|
||||||
|
|
||||||
unset_env_file () {
|
|
||||||
env=$(env_file $1)
|
|
||||||
[[ ! $env ]] && { iecho "Env file ${1} doesn't exist"; return 1; }
|
|
||||||
unset $(grep -v '^#' ${env} | sed -E 's/(.*)=.*/\1/' | xargs)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
shell_source_subdirs () {
|
shell_source_subdirs () {
|
||||||
# default processing
|
# default processing
|
||||||
[[ ! -d $1 ]] && echo no directory $1 from which to process subdirectories && return 1
|
[[ ! -d $1 ]] && echo no directory $1 from which to process subdirectories && return 1
|
||||||
local DIR=
|
local DIR
|
||||||
local SUBDIRS
|
local SUBDIRS
|
||||||
local IGNORE_FILE
|
local IGNORE_FILE
|
||||||
DIR=$1
|
DIR=$1
|
||||||
|
|
|
@ -0,0 +1,104 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# environment and environment file functions
|
||||||
|
|
||||||
|
clean_env_file () {
|
||||||
|
local compact
|
||||||
|
module_load helpers
|
||||||
|
# -c will also remove comments and all empty lines
|
||||||
|
[[ $1 == "-c" ]] && compact=true && shift 1
|
||||||
|
#
|
||||||
|
# remove trailing spaces | remove double quotes
|
||||||
|
# | remove blanks after equals and quote value | remove any spaces before afer =
|
||||||
|
# remove blank lines | remove comment lines if requested
|
||||||
|
cat $1 | sed_ignore_comments s/\\s*$//g | sed_ignore_comments s/\"//g \
|
||||||
|
| sed_ignore_comments s/\(=[[:blank:]]*\)\(.*\)/\\1\"\\2\"/ \
|
||||||
|
| sed_ignore_comments s/\\s*=\\s*/=/g \
|
||||||
|
| sed -rz 's/^\n+//; s/\n+$/\n/g' | if [[ $compact ]]; then grep -v '^#' | grep -v "^$" ; else cat; fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# https://stackoverflow.com/questions/19331497/set-environment-variables-from-file-of-key-value-pairs
|
||||||
|
env_file () {
|
||||||
|
env=${1:-.env}
|
||||||
|
[[ -f "${env}" ]] && { echo $env; return 0; } # || echo not $env
|
||||||
|
[[ -f "${env}.env" ]] && { echo "${env}.env"; return 0; } # || echo not ${env}.env
|
||||||
|
[[ -f "${env}/.env" ]] && { echo "${env}/.env"; return 0; } # || echo not ${env}/.env
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# ignore non assignment lines
|
||||||
|
list_env_file_vars () {
|
||||||
|
env=$(env_file $1)
|
||||||
|
# cat $env
|
||||||
|
[[ ! $env ]] && { iecho "Env file ${1} doesn't exist"; return 1; }
|
||||||
|
clean_env_file $env | grep -v '^#'| sed -n -E 's/(.*)=[^ =].*/\1/p' | xargs
|
||||||
|
}
|
||||||
|
|
||||||
|
function load_env_file() {
|
||||||
|
# second argument, "-x" will export within function (or anything called), "-gx" is equivalent of export and is global
|
||||||
|
env=$(env_file $1)
|
||||||
|
[[ ! $env ]] && { iecho "Env file ${1} doesn't exist"; return 1; }
|
||||||
|
while read line; do
|
||||||
|
# echo var to add $line
|
||||||
|
declare $2 "$(echo "${line}" | sed 's/\"//g' )"
|
||||||
|
done < <(clean_env_file -c $env)
|
||||||
|
}
|
||||||
|
|
||||||
|
# list_env_file_vals() {
|
||||||
|
# local vars
|
||||||
|
# vars=$(list_env_file_vars $1)
|
||||||
|
# echo $vars
|
||||||
|
# [[ $? -gt 0 ]] && return 1
|
||||||
|
# export_env_file $1
|
||||||
|
# for var in $vars ;
|
||||||
|
# do
|
||||||
|
# "$var=${!var}"
|
||||||
|
# done
|
||||||
|
# }
|
||||||
|
|
||||||
|
export_env_file () {
|
||||||
|
load_env_file $1 -gx
|
||||||
|
}
|
||||||
|
|
||||||
|
unset_env_file () {
|
||||||
|
env=$(env_file $1)
|
||||||
|
[[ ! $env ]] && { iecho "Env file ${1} doesn't exist"; return 1; }
|
||||||
|
unset $(clean_env_file -c ${env} | sed -E 's/(.*)=.*/\1/' | xargs)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
testenv () {
|
||||||
|
echo in testenv
|
||||||
|
echo TEST Variable $TEST
|
||||||
|
env | grep TEST
|
||||||
|
echo done testenv
|
||||||
|
}
|
||||||
|
|
||||||
|
# https://www.baeldung.com/linux/envsubst-command
|
||||||
|
# todo allow input file -o overwrite or to another file -f <name>
|
||||||
|
env_subs_file () {
|
||||||
|
local fin; local fenv; local useenv; local tout; local fout; local fenv; local tout2
|
||||||
|
[[ $1 == "-e" ]] && useenv=true && shift 1
|
||||||
|
[[ $1 == "-o" ]] && { shift 1; fout=$1; }
|
||||||
|
[[ $1 == "-f" ]] && { fout=$2; shift 2; }
|
||||||
|
fin=$1; fenv=$2
|
||||||
|
# echo useenv $useenv, fout $fout, fin $fin, fenv $fenv
|
||||||
|
[[ ! $fin ]] && iecho "nothing was passed to merge with environment" && return 1
|
||||||
|
[[ ! -f "$fin" ]] && iecho "file $fin does not exit nothing to merge with environment" && return 1
|
||||||
|
[[ ! $(cat $fin | grep -F "$") ]] && iecho "no variables in $fin to merge" && return 2
|
||||||
|
tout=/tmp/${USER}-mergedenvfile
|
||||||
|
if [[ $useenv ]] && [[ -f $fenv ]]; then
|
||||||
|
tout2=/tmp/${USER}-mergedenvfile2
|
||||||
|
cat $fin | envsubst "$(printf '${%s} ' $(env | cut -d'=' -f1) )" > $tout2
|
||||||
|
fin=$tout2
|
||||||
|
fi
|
||||||
|
if [[ -f $fenv ]]; then
|
||||||
|
(export_env_file $fenv; cat $fin | envsubst "$(printf '${%s} ' $(clean_env_file -c $fenv | cut -d'=' -f1) )")
|
||||||
|
else
|
||||||
|
cat $fin | envsubst "$(printf '${%s} ' $(env | cut -d'=' -f1) )"
|
||||||
|
fi > $tout
|
||||||
|
[[ -f $tout2 ]] && rm -f $tout2
|
||||||
|
[[ $fout ]] && mv -f $tout $fout || { echo merged; cat "$tout"; }
|
||||||
|
# env | grep BASE
|
||||||
|
# # unset_env_file $2
|
||||||
|
}
|
|
@ -14,49 +14,6 @@ isFile() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
#TODO
|
|
||||||
# env_file_pretty () {
|
|
||||||
# }
|
|
||||||
|
|
||||||
# https://www.baeldung.com/linux/envsubst-command
|
|
||||||
env_subs_file () {
|
|
||||||
module_load helpers
|
|
||||||
local input; local fenv; local all
|
|
||||||
[[ $1 == "-a" ]] && all=true && shift 1
|
|
||||||
input=$1
|
|
||||||
fenv=$2
|
|
||||||
[[ ! $input ]] && iecho "nothing was passed to merge with environment" && return 1
|
|
||||||
[[ -f "$input" ]] && input=$(cat "$input")
|
|
||||||
[[ ! $(echo $input | grep -F "$") ]] && iecho "nothing to merge in $1" && return 2
|
|
||||||
if [[ ($2 && ! -f $2) ]]; then
|
|
||||||
iecho "no enviroment file at $2" && return 3
|
|
||||||
else
|
|
||||||
# [[ $all ]] && export_file $fenv && unset fenv
|
|
||||||
if [[ $all ]]; then
|
|
||||||
fenv="/tmp/$USER/_tenvf"
|
|
||||||
# put quotes around values to avoid issues
|
|
||||||
env | sed 's/\(=[[:blank:]]*\)\(.*\)/\1"\2"/' > $fenv
|
|
||||||
cat $2 | sed 's/\(=[[:blank:]]*\)\(.*\)/\1"\2"/' | sed 's/\s*=\s*/=/g'
|
|
||||||
return
|
|
||||||
cat "$2" | sed 's/\(=[[:blank:]]*\)\(.*\)/\1"\2"/' >> $fenv
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if [[ $fenv ]]; then
|
|
||||||
(set -a;source "$fenv" ;set +a; echo -e "$input" | envsubst "$(printf '${%s} ' $(cat "$fenv" | cut -d'=' -f1) )")
|
|
||||||
else
|
|
||||||
echo -e "$input" | envsubst "$(printf '${%s} ' $(env | cut -d'=' -f1) )"
|
|
||||||
fi
|
|
||||||
[[ $all ]] && rm -f $fenv
|
|
||||||
# [[ $all ]] && unset_file $2
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# shift 1
|
|
||||||
# input=$1
|
|
||||||
# set -a;. $2 ;set +a;
|
|
||||||
# echo env file is now $2
|
|
||||||
# fi
|
|
||||||
|
|
||||||
build_file () {
|
build_file () {
|
||||||
# local file
|
# local file
|
||||||
# echo build file $1 $2
|
# echo build file $1 $2
|
||||||
|
@ -73,6 +30,7 @@ build_file () {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# TODO need to test
|
||||||
function lines_2_str () {
|
function lines_2_str () {
|
||||||
[[ ! -f "$1" ]] && return 1
|
[[ ! -f "$1" ]] && return 1
|
||||||
local str=''
|
local str=''
|
||||||
|
@ -83,13 +41,11 @@ function lines_2_str () {
|
||||||
# echo line: "${line}" >&2
|
# echo line: "${line}" >&2
|
||||||
str="$str ${line}"
|
str="$str ${line}"
|
||||||
# echo str: $str >&2
|
# echo str: $str >&2
|
||||||
done < $1
|
done < $1
|
||||||
# for line in $lines ; do
|
# for line in $lines ; do
|
||||||
# str+='"'$line'" '
|
# str+='"'$line'" '
|
||||||
# done
|
# done
|
||||||
echo $str
|
echo $str
|
||||||
# set +o noglob
|
|
||||||
return 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# find, superceeds find use `command find` to get the super
|
# find, superceeds find use `command find` to get the super
|
||||||
|
|
11
shell.env
11
shell.env
|
@ -78,7 +78,7 @@ declare parent
|
||||||
parent="$(dirname $BASH_SHELL_BASE)"
|
parent="$(dirname $BASH_SHELL_BASE)"
|
||||||
|
|
||||||
# Any Host
|
# Any Host
|
||||||
BASH_SHELL_ANY_HOST="${parent}/any/host # or set to"
|
BASH_SHELL_ANY_HOST="${parent}/any/host"
|
||||||
# export BASH_SHELL_ALL_HOSTS=<some directory>
|
# export BASH_SHELL_ALL_HOSTS=<some directory>
|
||||||
[[ -d $BASH_SHELL_ANY_HOST ]] && BASH_SHELL_DIRS+="$BASH_SHELL_ANY_HOST " && export BASH_SHELL_ANY_HOST
|
[[ -d $BASH_SHELL_ANY_HOST ]] && BASH_SHELL_DIRS+="$BASH_SHELL_ANY_HOST " && export BASH_SHELL_ANY_HOST
|
||||||
|
|
||||||
|
@ -104,20 +104,23 @@ BASH_SHELL_DEV=${BASH_SHELL_DEV:-/opt/shell}
|
||||||
export BASH_SHELL_USER_DIR=$HOME/shell
|
export BASH_SHELL_USER_DIR=$HOME/shell
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# #################### NETWORKING #########################
|
||||||
|
|
||||||
# set up default location to look for other network shell directories
|
# set up default location to look for other network shell directories
|
||||||
BASH_NETWORKS_DIR=$parent/networks
|
BASH_NETWORKS_DIR=$parent/networks
|
||||||
# BASH_NETWORKS_DIR=<some directory> # alt directory to look for networks
|
# BASH_NETWORKS_DIR=<some directory> # alt directory to look for networks
|
||||||
export BASH_NETWORKS_DIR
|
export BASH_NETWORKS_DIR
|
||||||
|
|
||||||
# set one or the other of these here for all users or put in shell.env under HOST/USER/DEV directories
|
# set one or the other of these in custom shell.env under HOST/USER/DEV directories
|
||||||
# if you want to load networks with every shell
|
# if you want to load networks with every shell
|
||||||
# export BASH_SHELL_HOME_NETWORK_LOAD=true
|
# export BASH_SHELL_HOME_NETWORK_LOAD=true
|
||||||
# export BASH_SHELL_NETWORKS_LOAD=true
|
# export BASH_SHELL_NETWORKS_LOAD=true
|
||||||
# export BASH_SHELL_NETWORK=<some directory>
|
# export BASH_SHELL_NETWORK=<some directory>
|
||||||
|
|
||||||
|
|
||||||
# now load and export module loading functions library so it is always available
|
# now load and export bootstrap module loading functions library so it is always available
|
||||||
source $BASH_SHELL_BASE/module.lib
|
set -a;source $BASH_SHELL_BASE/module.lib;set +a
|
||||||
|
|
||||||
# echo done shell.env
|
# echo done shell.env
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue