add modules function to find and load modules
refactored functions_list to assist with finding functions within a script file refactored prompt PS1 setup and added colors variables added block module to base which will write and edit a block of lines to any text file improve setup.sh, now can be reused for other shell repos to default sourcemaster
parent
8d8ade7810
commit
189ba95076
38
README.md
38
README.md
|
@ -1,16 +1,19 @@
|
||||||
# Bash Shell Setup Repo
|
# Bash Shell Organizer
|
||||||
A better way to keep organized and share interactive (.bashrc) environment, aliases, functions, modules
|
A better way to keep your shell setup organized, clean, and useful
|
||||||
|
|
||||||
|
interactive (.bashrc) environment, aliases, functions, modules
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
Clone to a directory
|
Clone to a directory
|
||||||
|
|
||||||
`git clone https://git.kebler.net/bashrc <repo path>` e.g. /opt/shell
|
`git clone https://git.kebler.net/bashrc <repo path>` suggestion: /opt/shell/base
|
||||||
|
|
||||||
now edit your `~/.bashrc` with nano or other available editor
|
now edit your `~/.bashrc` with nano or other available editor
|
||||||
|
|
||||||
add this
|
add this
|
||||||
```
|
```
|
||||||
|
# BASH_SHELL is a common parent directory that should be set in /etc/bash.bashrc
|
||||||
export BASH_SHELL_REPO=<repo path>/setup.
|
export BASH_SHELL_REPO=<repo path>/setup.
|
||||||
source $BASH_SHELL_REPO/setup.sh
|
source $BASH_SHELL_REPO/setup.sh
|
||||||
```
|
```
|
||||||
|
@ -25,10 +28,33 @@ The sourced files in this repo should be NOT be user/machine/network specific
|
||||||
if you include any of these environment variables all files in there directories will be sourced where
|
if you include any of these environment variables all files in there directories will be sourced where
|
||||||
|
|
||||||
|
|
||||||
export BASH_SHELL_USER=<path> # will be in home/<USER>
|
# unless below specific directories are set
|
||||||
export BASH_SHELL_MACHINE=<path> #parent directory e.g. opt/shell/machine
|
# shell files are sourced in this order
|
||||||
export BASH_SHELL_NETWORK=<path> #parent directory e.g. opt/shell/network
|
# sourced via /etc/bash.bashrc so for all machine users
|
||||||
|
# $BASH_SHELL_BASE # this MUST be set in /etc/bash.bashrc
|
||||||
|
# $BASH_SHELL_NETWORK/all
|
||||||
|
# $BASH_SHELL_NETWORK/$NETWORKNAME
|
||||||
|
# $BASH_SHELL_HOST/all
|
||||||
|
# $BASH_SHELL_HOST/<hostname>
|
||||||
|
# sourced via $HOME/.bashrc
|
||||||
|
# $HOME/shell or $HOME/BASH_SHELL_USER
|
||||||
|
|
||||||
|
# within each of those directories if setup.sh exits it will be run
|
||||||
|
# otherwise files will be sourced exactly like in the base
|
||||||
|
|
||||||
|
# identify a network name that this host resides on
|
||||||
|
# like hostname but for the LAN network
|
||||||
|
# if unset then only /all will be sourced
|
||||||
|
export NETWORKNAME=238
|
||||||
|
# will use $BASH_SHELL_NETWORK/$NETWORKNAME under this directory unless specifically set
|
||||||
|
export BASH_SHELL_NETWORK=$BASH_SHELL/network
|
||||||
|
|
||||||
|
# will use $BASH_SHELL_HOST/<hostname> unless specifically set
|
||||||
|
export BASH_SHELL_HOST=$BASH_SHELL/host
|
||||||
|
|
||||||
|
# by default SHELL sources will be looked for under $HOME/bash/shell
|
||||||
|
# but can be user set below to $HOME/$BASH_SHELL_USER
|
||||||
|
# export BASH_SHELL_USER=<some directory under $HOME>
|
||||||
if there is a script setup.sh in the root of these directoies it will be run. If not then all files no matter how deep will be sourced in alpha order order.
|
if there is a script setup.sh in the root of these directoies it will be run. If not then all files no matter how deep will be sourced in alpha order order.
|
||||||
|
|
||||||
For those
|
For those
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
# shell files are sourced in this order
|
# shell files are sourced in this order
|
||||||
# sourced via /etc/bash.bashrc so for all machine users
|
# sourced via /etc/bash.bashrc so for all machine users
|
||||||
# $BASH_SHELL_BASE # this MUST be set in /etc/bash.bashrc
|
# $BASH_SHELL_BASE # this MUST be set in /etc/bash.bashrc
|
||||||
|
|
||||||
# $BASH_SHELL_NETWORK/all
|
# $BASH_SHELL_NETWORK/all
|
||||||
# $BASH_SHELL_NETWORK/$NETWORKNAME
|
# $BASH_SHELL_NETWORK/$NETWORKNAME
|
||||||
# $BASH_SHELL_HOST/all
|
# $BASH_SHELL_HOST/all
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
#!/bin/bash
|
||||||
|
export TERM=xterm-color
|
||||||
|
export GREP_OPTIONS='--color=auto' GREP_COLOR='1;32'
|
||||||
|
export CLICOLOR=1
|
||||||
|
export LSCOLORS=ExFxCxDxBxegedabagacad
|
||||||
|
|
||||||
|
|
||||||
|
export COLOR_NC='\e[0m' # No Color
|
||||||
|
export COLOR_BLACK='\e[0;30m'
|
||||||
|
export COLOR_GRAY='\e[1;30m'
|
||||||
|
export COLOR_RED='\e[0;31m'
|
||||||
|
export COLOR_LIGHT_RED='\e[1;31m'
|
||||||
|
export COLOR_GREEN='\e[0;32m'
|
||||||
|
export COLOR_LIGHT_GREEN='\e[1;32m'
|
||||||
|
export COLOR_BROWN='\e[0;33m'
|
||||||
|
export COLOR_YELLOW='\e[1;33m'
|
||||||
|
export COLOR_BLUE='\e[0;34m'
|
||||||
|
export COLOR_LIGHT_BLUE='\e[1;34m'
|
||||||
|
export COLOR_PURPLE='\e[0;35m'
|
||||||
|
export COLOR_LIGHT_PURPLE='\e[1;35m'
|
||||||
|
export COLOR_CYAN='\e[0;36m'
|
||||||
|
export COLOR_LIGHT_CYAN='\e[1;36m'
|
||||||
|
export COLOR_LIGHT_GRAY='\e[0;37m'
|
||||||
|
export COLOR_WHITE='\e[1;37m'
|
|
@ -4,11 +4,28 @@
|
||||||
##-- functions which may be used by any of the alias file --#
|
##-- functions which may be used by any of the alias file --#
|
||||||
|
|
||||||
function function_list() {
|
function function_list() {
|
||||||
|
if [ $1 ]; then
|
||||||
|
local STR
|
||||||
|
local func
|
||||||
|
declare -a FUNCS
|
||||||
|
STR=$(grep '() {\|(){\|function' $1)
|
||||||
|
readarray -t LIST <<<"$STR"
|
||||||
|
for func in "${LIST[@]}"
|
||||||
|
do
|
||||||
|
if [[ ! $func =~ ^# ]]; then
|
||||||
|
func=${func#function }
|
||||||
|
func=${func%()?( ){}
|
||||||
|
[[ ! $func =~ ^_ ]] && FUNCS+=($func)
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "${FUNCS[@]}"
|
||||||
|
else
|
||||||
echo
|
echo
|
||||||
echo -e "\033[1;4;32m""Functions:""\033[0;34m"
|
echo -e "\033[1;4;32m""Functions:""\033[0;34m"
|
||||||
declare -F | grep -v "declare -f\s_" | awk {'print $3'}
|
declare -F | grep -v "declare -f\s_" | awk {'print $3'}
|
||||||
echo
|
echo
|
||||||
echo -e "\033[0m"
|
echo -e "\033[0m"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function alias_list() {
|
function alias_list() {
|
||||||
|
@ -22,10 +39,23 @@ function alias_list() {
|
||||||
rsynchc() { rsync --help | grep "\-$1"; }
|
rsynchc() { rsync --help | grep "\-$1"; }
|
||||||
alias rsynch="rsynchc"
|
alias rsynch="rsynchc"
|
||||||
|
|
||||||
change-ext() {
|
get_shopt () {
|
||||||
shopt -s globstar
|
echo $([ "$(shopt -p $1 | grep '\-s')" ] && echo on || echo off)
|
||||||
rename -n 's/.'+$1+'/.'+$2+'/' **
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
change-ext() {
|
||||||
|
local depth
|
||||||
|
local d
|
||||||
|
d=${3:-0}
|
||||||
|
let d+=1
|
||||||
|
[ $d -lt 1 ] && depth="" || depth=" -maxdepth $d "
|
||||||
|
find . $depth -name '*.'$1 -exec rename -n 's/\.'$1'/.'$2'/' \{} \;
|
||||||
|
read -p "do REALLY want to change the extensions? " -n 1 -r
|
||||||
|
echo
|
||||||
|
[[ ! $REPLY =~ ^[Yy]$ ]] && return 1
|
||||||
|
find . $depth -name '*.'$1 -exec rename 's/\.'$1'/.'$2'/' \{} \;
|
||||||
|
}
|
||||||
|
|
||||||
alias chext=change-ext
|
alias chext=change-ext
|
||||||
|
|
||||||
# find in any file
|
# find in any file
|
||||||
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
module_confirm () {
|
||||||
|
local FILE
|
||||||
|
local DIR
|
||||||
|
local NAME
|
||||||
|
DIR=$1
|
||||||
|
NAME=$2
|
||||||
|
# echo finding $NAME in $DIR
|
||||||
|
FILE="$(find ${DIR} -type f -name "${NAME}.mod" -o -name "${NAME}".sh)"
|
||||||
|
# echo files found $FILE
|
||||||
|
COUNT=0
|
||||||
|
if [ "$FILE" ]; then
|
||||||
|
COUNT=$(echo $FILE | xargs -n 1 | wc -l)
|
||||||
|
fi
|
||||||
|
# echo Number: $COUNT
|
||||||
|
if [ $COUNT -gt 1 ]; then
|
||||||
|
echo two or more modules of same name found, aborting
|
||||||
|
echo $FILE | xargs -n 1
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
[ $COUNT == 1 ] && echo $FILE && return 0
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# if succesfull returns the path
|
||||||
|
function module_find () {
|
||||||
|
|
||||||
|
[ ! $1 ] && echo "no module specified" && return 1
|
||||||
|
|
||||||
|
local MDIRS
|
||||||
|
local MDIR
|
||||||
|
local DIRS
|
||||||
|
local MODULE=$1
|
||||||
|
DIRS=( \
|
||||||
|
$([ $BASH_SHELL_USER ] && echo $HOME/$BASH_SHELL_USER || echo $HOME/bash/shell) \
|
||||||
|
$BASH_SHELL_HOST/$(hostname)
|
||||||
|
$BASH_SHELL_HOST/all \
|
||||||
|
$BASH_SHELL_NETWORK/$NETWORKNAME \
|
||||||
|
$BASH_SHELL_NETWORK/all \
|
||||||
|
$BASH_SHELL_BASE \
|
||||||
|
)
|
||||||
|
|
||||||
|
# echo ${DIRS[@]}
|
||||||
|
|
||||||
|
MDIRS=()
|
||||||
|
j=0
|
||||||
|
cnt=${#DIRS[@]}
|
||||||
|
for ((i=0;i<cnt;i++)); do
|
||||||
|
DIR="${DIRS[i]}/modules"
|
||||||
|
[ -d $DIR ] && MDIRS[j]=$DIR && j+=1
|
||||||
|
done
|
||||||
|
|
||||||
|
[ $MODULE_DIRS ] && MDIRS=("$MODULE_DIRS" "${MDIRS[@]}")
|
||||||
|
|
||||||
|
# echo Module Directories ${MDIRS[@]}
|
||||||
|
|
||||||
|
for MDIR in "${MDIRS[@]}"
|
||||||
|
do
|
||||||
|
# echo mdir $MDIR name $MODULE
|
||||||
|
RES=$(module_confirm "$MDIR" "$MODULE")
|
||||||
|
[ $? -eq 0 ] && echo $RES && return 0
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
module_load () {
|
||||||
|
[ ! $1 ] && echo "no module specified" && return 1
|
||||||
|
local FILE
|
||||||
|
FILE=$(module_find $1)
|
||||||
|
[ $? -ne 0 ] && echo no module $1 found && return 1
|
||||||
|
# source $FILE "$0"
|
||||||
|
source $FILE
|
||||||
|
echo $FILE
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
module_loaded () {
|
||||||
|
[ ! $1 ] && echo "no module specified" && return 1
|
||||||
|
local func
|
||||||
|
local ret
|
||||||
|
local file
|
||||||
|
ret=0
|
||||||
|
# function_list | grep module
|
||||||
|
file=$(module_find $1)
|
||||||
|
[ ! $file ] && echo no module $1 found && return 1
|
||||||
|
# echo "$(function_list $file)"
|
||||||
|
for func in $(function_list $file)
|
||||||
|
do
|
||||||
|
[ ! $(function_list | grep $func) ] && echo "$func not loaded" && ret=1 || echo "$func loaded"
|
||||||
|
done
|
||||||
|
[ $ret = 0 ] && echo all functions loaded
|
||||||
|
return $ret
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_modules {
|
||||||
|
RED='\033[0;31m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
echo module to test: $1
|
||||||
|
echo --------------------
|
||||||
|
echo -e "testing: ${RED}module_find${NC}"
|
||||||
|
FILE=$(module_find $1)
|
||||||
|
[ $? -ne 0 ] && echo no module $1 found && return 1
|
||||||
|
echo module $FILE found
|
||||||
|
# . $FILE
|
||||||
|
echo ---------------
|
||||||
|
echo -e "testing: ${RED}module_load${NC}"
|
||||||
|
module_load $1
|
||||||
|
[ $? -ne 0 ] && echo no module $1 found && return 1
|
||||||
|
echo loaded module $1
|
||||||
|
echo ----------------------
|
||||||
|
echo -e "testing: ${RED}module_loaded${NC}"
|
||||||
|
module_loaded $1
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# see
|
||||||
|
# used http://bashrcgenerator.com/
|
||||||
|
# and
|
||||||
|
# https://unix.stackexchange.com/questions/148/colorizing-your-terminal-and-shell-environment/174#174
|
||||||
|
|
||||||
|
function parse_git_branch() {
|
||||||
|
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
|
||||||
|
}
|
||||||
|
|
||||||
|
function fancy_prompt () {
|
||||||
|
|
||||||
|
# if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
|
||||||
|
|
||||||
|
function c () {
|
||||||
|
local color
|
||||||
|
name=COLOR_$1
|
||||||
|
color=${!name}
|
||||||
|
echo '\['$color'\]'
|
||||||
|
}
|
||||||
|
|
||||||
|
case $TERM in
|
||||||
|
xterm*|rxvt*)
|
||||||
|
# local TITLEBAR='\[\033]0;\u ${NEW_PWD}\007\]'
|
||||||
|
local PARENTBASE='${PWD#"${PWD%/*/*}/"}'
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
local PARENTBASE=''
|
||||||
|
# local TITLEBAR=""
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
local UC=WHITE # user's color
|
||||||
|
[ $UID -eq "0" ] && UC=RED # root's color
|
||||||
|
|
||||||
|
# PS1="$PARENTBASE\[${UC}\]\u@\h: \[${COLOR_LIGHT_GREEN}\]→\[${COLOR_NC}\] "
|
||||||
|
|
||||||
|
local user
|
||||||
|
local machine
|
||||||
|
local dir
|
||||||
|
local branch
|
||||||
|
local promptc
|
||||||
|
user="$(c $UC)\u$(c GREY)@$(c NC)"
|
||||||
|
machine="$(c CYAN)\h$(c GREY):$(c NC)"
|
||||||
|
dir="$(c YELLOW)[${PARENTBASE}]$(c NC)"
|
||||||
|
branch=$(c LIGHT_BLUE)'$(parse_git_branch)'$(c NC)
|
||||||
|
promptc=$(c GREEN)' $ '$(c NC)
|
||||||
|
|
||||||
|
PS1=$(echo "$user$machine$dir$branch$promptc")
|
||||||
|
# echo $PS1
|
||||||
|
}
|
||||||
|
|
||||||
|
# fancy prompt is on by default comment out to disable default
|
||||||
|
fancy_prompt
|
27
misc/prompt
27
misc/prompt
|
@ -1,27 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# uncomment for a colored prompt, if the terminal has the capability; turned
|
|
||||||
# off by default to not distract the user: the focus in a terminal window
|
|
||||||
# should be on the output of commands, not on the prompt
|
|
||||||
#force_color_prompt=yes
|
|
||||||
|
|
||||||
if [ -n "$force_color_prompt" ]; then
|
|
||||||
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
|
|
||||||
# We have color support; assume it's compliant with Ecma-48
|
|
||||||
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
|
|
||||||
# a case would tend to support setf rather than setaf.)
|
|
||||||
color_prompt=yes
|
|
||||||
else
|
|
||||||
color_prompt=
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# use http://bashrcgenerator.com/
|
|
||||||
PARENTBASE='${PWD#"${PWD%/*/*}/"}'
|
|
||||||
PS1="\[\033[38;5;11m\]\u\[$(tput sgr0)\]@\h:\[$(tput sgr0)\]\[\033[38;5;6m\][\[$(tput sgr0)\]\[\033[38;5;14m\]${PARENTBASE}\[$(tput sgr0)\]\[\033[38;5;6m\]]\[$(tput sgr0)\]\[$(tput sgr0)\]"
|
|
||||||
|
|
||||||
parse_git_branch() {
|
|
||||||
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
|
|
||||||
}
|
|
||||||
PS1="$PS1\[\033[00m\]\$(parse_git_branch)\$ "
|
|
|
@ -17,7 +17,7 @@ function bmount(){
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function bumount(){
|
bumount () {
|
||||||
echo "removing bind mount at $1"
|
echo "removing bind mount at $1"
|
||||||
notify-send "removing bind mount at ${1}" --icon=dialog-information -t 2000
|
notify-send "removing bind mount at ${1}" --icon=dialog-information -t 2000
|
||||||
fusermount -u "$1"
|
fusermount -u "$1"
|
||||||
|
|
|
@ -6,7 +6,7 @@ BLOCK_COMMENT_CHAR="#"
|
||||||
# a comment added before the block
|
# a comment added before the block
|
||||||
BLOCK_DESCRIPTION=""
|
BLOCK_DESCRIPTION=""
|
||||||
|
|
||||||
function __update () {
|
function __update_block () {
|
||||||
if [ ! -z "$BLOCK_FILE" ]; then
|
if [ ! -z "$BLOCK_FILE" ]; then
|
||||||
touch $BLOCK_FILE
|
touch $BLOCK_FILE
|
||||||
tail -c1 $BLOCK_FILE | read -r _ || echo >> $BLOCK_FILE
|
tail -c1 $BLOCK_FILE | read -r _ || echo >> $BLOCK_FILE
|
||||||
|
@ -19,10 +19,11 @@ function __update () {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
__update
|
# set block to defaults
|
||||||
|
__update_block
|
||||||
# echo -e "default block template follows use: block-set before block-add to change>\n" $BLOCK
|
# echo -e "default block template follows use: block-set before block-add to change>\n" $BLOCK
|
||||||
|
|
||||||
function set-block () {
|
function set_block () {
|
||||||
|
|
||||||
declare OPTION
|
declare OPTION
|
||||||
declare OPTARG
|
declare OPTARG
|
||||||
|
@ -52,7 +53,7 @@ done
|
||||||
|
|
||||||
shift $(( OPTIND - 1 ))
|
shift $(( OPTIND - 1 ))
|
||||||
|
|
||||||
__update
|
__update_block
|
||||||
echo -e "new block template follows use: block-add >\n" $BLOCK
|
echo -e "new block template follows use: block-add >\n" $BLOCK
|
||||||
echo ----
|
echo ----
|
||||||
echo $([ -e "$BLOCK_FILE" ] || echo "Warning: No output file set yet, use block-set -f <path>" && echo "block will be placed in $BLOCK_FILE")
|
echo $([ -e "$BLOCK_FILE" ] || echo "Warning: No output file set yet, use block-set -f <path>" && echo "block will be placed in $BLOCK_FILE")
|
||||||
|
@ -60,7 +61,7 @@ __update
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function add-block () {
|
function add_block () {
|
||||||
# only add if it doesn't exist, existance is only based on block begin
|
# only add if it doesn't exist, existance is only based on block begin
|
||||||
local ADD
|
local ADD
|
||||||
ADD=$(echo "${BLOCK}" | sed 's/\//\\\//g')
|
ADD=$(echo "${BLOCK}" | sed 's/\//\\\//g')
|
||||||
|
@ -68,14 +69,29 @@ if [ -e "$BLOCK_FILE" ]; then
|
||||||
sed -n '/^[ \t]*'"${BLOCK_BEGIN}"'/{q50}' "${BLOCK_FILE}"
|
sed -n '/^[ \t]*'"${BLOCK_BEGIN}"'/{q50}' "${BLOCK_FILE}"
|
||||||
[ $? == 50 ] && return
|
[ $? == 50 ] && return
|
||||||
WHERE=${1-${BLOCK_BEGIN}} # default is end
|
WHERE=${1-${BLOCK_BEGIN}} # default is end
|
||||||
echo Where $WHERE
|
# echo Where $WHERE
|
||||||
sed -i '/'"${WHERE}"'/{s/.*/&\n'"${ADD}"'/;h};${x;/^$/{s//'"$ADD"'/;H};x}' "${BLOCK_FILE}"
|
sed -i '/'"${WHERE}"'/{s/.*/&\n'"${ADD}"'/;h};${x;/^$/{s//'"$ADD"'/;H};x}' "${BLOCK_FILE}"
|
||||||
else
|
else
|
||||||
echo "no file set in which to add block, use: set-block -f <file path>"
|
echo "no file set in which to add block, use: ${RED_COLOR}set-block -f <file path>"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
modify-block () {
|
get_block () {
|
||||||
|
if [[ $1 =~ -?r(aw)? ]]; then
|
||||||
|
echo $BLOCK
|
||||||
|
else
|
||||||
|
local block
|
||||||
|
block=${BLOCK##'\n'}'\n'
|
||||||
|
printf "$block"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_block_file () {
|
||||||
|
[ $BLOCK_FILE ] && echo ${BLOCK_FILE}
|
||||||
|
[[ $1 = -v ]] && echo "no output file set, use set_block -f <file-path>"
|
||||||
|
}
|
||||||
|
|
||||||
|
modify_block () {
|
||||||
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
||||||
/'"${BLOCK_BEGIN}"'/b
|
/'"${BLOCK_BEGIN}"'/b
|
||||||
/'"${BLOCK_END}"'/b
|
/'"${BLOCK_END}"'/b
|
||||||
|
@ -83,20 +99,21 @@ modify-block () {
|
||||||
}' "${BLOCK_FILE}"
|
}' "${BLOCK_FILE}"
|
||||||
}
|
}
|
||||||
|
|
||||||
remove-block () {
|
block_remove_leading () {
|
||||||
[ -z "$BLOCK_DESCRIPTION" ] || sed -ni '/'"${BLOCK_BEGIN}"'/{x;d;};1h;1!{x;p;};${x;p;}' "${BLOCK_FILE}"
|
printf "%s\n" "$(tac $BLOCK_FILE \
|
||||||
remove-block-leading
|
| sed '/'"${BLOCK_BEGIN}"'/,/^./{ /^[ \t]*$/d}' | tac)" > $BLOCK_FILE
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_block () {
|
||||||
|
[[ "$BLOCK_DESCRIPTION" ]] || sed -ni '/'"${BLOCK_BEGIN}"'/{x;d;};1h;1!{x;p;};${x;p;}' "${BLOCK_FILE}"
|
||||||
|
block_remove_leading
|
||||||
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
||||||
d
|
d
|
||||||
}' "${BLOCK_FILE}"
|
}' "${BLOCK_FILE}"
|
||||||
}
|
}
|
||||||
|
|
||||||
remove-block-leading () {
|
|
||||||
printf "%s\n" "$(tac $BLOCK_FILE \
|
|
||||||
| sed '/'"${BLOCK_BEGIN}"'/,/^./{ /^[ \t]*$/d}' | tac)" > $BLOCK_FILE
|
|
||||||
}
|
|
||||||
|
|
||||||
block-remove-content () {
|
block_remove_content () {
|
||||||
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
||||||
/'"${BLOCK_BEGIN}"'/b
|
/'"${BLOCK_BEGIN}"'/b
|
||||||
/'"${BLOCK_END}"'/b
|
/'"${BLOCK_END}"'/b
|
||||||
|
@ -105,7 +122,7 @@ block-remove-content () {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
block-add-line () {
|
block_add_line () {
|
||||||
# echo argument count $#, $1, $2, $3
|
# echo argument count $#, $1, $2, $3
|
||||||
local ADD
|
local ADD
|
||||||
ADD="/^${BLOCK_BEGIN}/a\\${1}"
|
ADD="/^${BLOCK_BEGIN}/a\\${1}"
|
||||||
|
@ -126,19 +143,19 @@ sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
||||||
}' "${BLOCK_FILE}"
|
}' "${BLOCK_FILE}"
|
||||||
}
|
}
|
||||||
|
|
||||||
block-remove-line () {
|
block_remove_line () {
|
||||||
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
||||||
/'"${1}"'/d
|
/'"${1}"'/d
|
||||||
}' "${BLOCK_FILE}"
|
}' "${BLOCK_FILE}"
|
||||||
}
|
}
|
||||||
|
|
||||||
block-change-line () {
|
block_change_line () {
|
||||||
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
||||||
/'"${1}"'/c\'"${2}"'
|
/'"${1}"'/c\'"${2}"'
|
||||||
}' "${BLOCK_FILE}"
|
}' "${BLOCK_FILE}"
|
||||||
}
|
}
|
||||||
|
|
||||||
block-modify-line () {
|
block_modify_line () {
|
||||||
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
||||||
/'"${BLOCK_BEGIN}"'/b
|
/'"${BLOCK_BEGIN}"'/b
|
||||||
/'"${BLOCK_END}"'/b
|
/'"${BLOCK_END}"'/b
|
||||||
|
|
3
options
3
options
|
@ -7,7 +7,8 @@ shopt -s checkwinsize
|
||||||
# If set, the pattern "**" used in a pathname expansion context will
|
# If set, the pattern "**" used in a pathname expansion context will
|
||||||
# match all files and zero or more directories and subdirectories.
|
# match all files and zero or more directories and subdirectories.
|
||||||
#shopt -s globstar
|
#shopt -s globstar
|
||||||
|
# if expanding aliases in all non-interactive shell is desired then uncomment
|
||||||
|
shopt -s expand_aliases
|
||||||
# enable programmable completion features (you don't need to enable
|
# enable programmable completion features (you don't need to enable
|
||||||
# if it's already enabled in /etc/bash.bashrc and /etc/profile
|
# if it's already enabled in /etc/bash.bashrc and /etc/profile
|
||||||
# sources /etc/bash.bashrc).
|
# sources /etc/bash.bashrc).
|
||||||
|
|
25
setup.sh
25
setup.sh
|
@ -15,17 +15,18 @@ else
|
||||||
local DSUBDIRS
|
local DSUBDIRS
|
||||||
|
|
||||||
DIR=${1:-$BASH_SHELL_BASE}
|
DIR=${1:-$BASH_SHELL_BASE}
|
||||||
echo $DIR
|
# echo soucring directory $DIR
|
||||||
|
|
||||||
if [ -d "$DIR" ]; then
|
if [ -d "$DIR" ]; then
|
||||||
if [ "$DIR" = "$BASH_SHELL_BASE" ] && [ $BASH_SHELL_BASE_SOURCED ]; then
|
if [ "$DIR" = "$BASH_SHELL_BASE" ] && [ "$BASH_SHELL_BASE_SOURCED" = "true" ]; then
|
||||||
if [ -v PS1 ]; then
|
if [ -v PS1 ]; then
|
||||||
echo base directory already sourced
|
echo base directory already sourced
|
||||||
read -p "do you want to re-source the base (not recommended)? " -n 1 -r
|
read -p "do you want to re-source the base (not recommended)? " -n 1 -r
|
||||||
echo
|
echo
|
||||||
[[ ! $REPLY =~ ^[Yy]$ ]] && return 1
|
[[ ! $REPLY =~ ^[Yy]$ ]] && return 1
|
||||||
else
|
# else
|
||||||
return 1
|
# echo non-interactive shell
|
||||||
|
# return 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -43,21 +44,19 @@ else
|
||||||
for SUBDIR in "${SUBDIRS[@]}"
|
for SUBDIR in "${SUBDIRS[@]}"
|
||||||
do
|
do
|
||||||
if [ -e "$DIR/$SUBDIR" ]; then
|
if [ -e "$DIR/$SUBDIR" ]; then
|
||||||
echo processing subdirectory $DIR/$SUBDIR
|
# echo processing subdirectory $DIR/$SUBDIR
|
||||||
# must quote all globs to avoid bash glob expansion which is likely on
|
# must quote all globs to avoid bash glob expansion which is likely on
|
||||||
source_dir -p "archive" -x '"*.off" "*.md"' -d 0 $DIR/$SUBDIR
|
source_dir -p "archive" -x '"*.off" "*.md"' -d 0 $DIR/$SUBDIR
|
||||||
else
|
# else
|
||||||
echo no subdirectory $DIR/$SUBDIR to process, ignorning
|
# echo no subdirectory $DIR/$SUBDIR to process, ignorning
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
echo "done sourcing directory $DIR"
|
# echo "done sourcing directory $DIR"
|
||||||
else
|
# else
|
||||||
echo $DIR does not exist nothing to source
|
# echo $DIR does not exist nothing to source
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# process the base directory by default
|
# process the base directory by default
|
||||||
|
@ -73,6 +72,6 @@ shell_process_directory "$BASH_SHELL_HOST/$(hostname)"
|
||||||
# process user
|
# process user
|
||||||
# Note: $HOME/shell or $HOME/BASH_SHELL_USER are sourced via $HOME/.bashrc
|
# Note: $HOME/shell or $HOME/BASH_SHELL_USER are sourced via $HOME/.bashrc
|
||||||
|
|
||||||
echo $(envg BASH) | xargs -n 1
|
# echo $(envg BASH) | xargs -n 1
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
Reference in New Issue