Remove more unused scripts

This commit is contained in:
2022-08-15 20:37:03 +08:00
parent 824fcee942
commit 4f8e48cea3
21 changed files with 22 additions and 179 deletions

35
bash/sources/09_ssh-agent Executable file
View File

@@ -0,0 +1,35 @@
#!/bin/bash
# ssh-agent key lifetime
alias ssh-add="ssh-add -t 43200"
SSH_ENV="$HOME/.ssh/environment"
function start_agent {
echo "Initialising new SSH agent..."
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" > /dev/null
# Test the ssh-add if status return 0/1, agent is initialized
/usr/bin/ssh-add;
ST=$?
if [ $ST -ne 0 ] && [ $ST -ne 1 ]; then
return $ST
fi
return 0
}
# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" > /dev/null
#ps ${SSH_AGENT_PID} doesn't work under cywgin
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi

38
bash/sources/10_aliases Executable file
View File

@@ -0,0 +1,38 @@
#!/bin/bash
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
alias dir='dir --color=auto'
alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
# some more ls aliases
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
# directory navigations
alias p=pushd
alias pp='pushd +2'
alias p3='pushd +3'
alias p4='pushd +4'
alias o=popd
alias d='dirs -v'
# default grep opts
alias grep='grep --color=auto --exclude-dir .git'
# Wget prefix
alias wget='wget --directory-prefix="$HOME/Downloads"'
# Pretty print sqlite3
alias sqlite3="sqlite3 -header -column"
# Kubernetes
alias kconf='kubectl config'

19
bash/sources/12_shortcuts Executable file
View File

@@ -0,0 +1,19 @@
#!/bin/bash
function sanitize-perms {
chown $USER.$USER . -R
find . -type d -exec chmod 755 {}\;
find . -type f -exec chmod 644 {}\;
}
# Kubernetes
function kres {
local _O _D
_O="-ocustom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name"
_D="[0-9A-Za-z\-]"
if [ -z "$3" ]; then
kubectl get $1 -A $_O | grep "$2"
else
kubectl get $1 -A $_O | grep "$_D*$2$_D*\s\+$_D*$3$_D*"
fi
}

21
bash/sources/15_gpg-agent Normal file
View File

@@ -0,0 +1,21 @@
#!/bin/bash
which gpg-agent 2>&1 > /dev/null
if [ $? -eq 0 ]; then
GPG_ENV="$HOME/.gnupg/environment"
function __start_agent {
gpg-agent --daemon > "${GPG_ENV}"
chmod 600 "${GPG_ENV}"
. "${GPG_ENV}" > /dev/null
}
if [ -f "${GPG_ENV}" ]; then
. "${GPG_ENV}" > /dev/null
gpg-agent > /dev/null 2>&1
[ "$?" -ne 0 ] && { __start_agent; }
else
__start_agent;
fi
fi

305
bash/sources/16_keystore Normal file
View File

@@ -0,0 +1,305 @@
#!/bin/bash
_SQLITE=$( which sqlite3 2>&1 )
if [ $? -ne 0 ]; then
echo "sqlite3 is missing" >&2
return 1
fi
echo "test" | openssl enc -e -aes-256-cbc -pbkdf2 -k test 2>/dev/null > /dev/null
if [ $? -ne 0 ]; then
echo "openssl does not exists nor support pbkdf2" >&2
return 1
fi
_AUTH_DB=$RBASH_HOME/keystore.db
_AUTH_SECRET=
_KSTORE_DEF_PROP=${_KSTORE_DEF_PROP:-val}
if [ -f "$RBASH_HOME/keystore.secret" ]; then
_AUTH_SECRET=$( cat "$RBASH_HOME/keystore.secret" )
fi
function kstore {
case $1 in
add) shift; kstore-add "$@" ;;
del) shift; kstore-del "$@" ;;
get) shift; kstore-get "$@" ;;
list) shift; kstore-list "$@" ;;
query) shift; kstore-query "$@" ;;
update) shift; kstore-update "$@" ;;
search) shift; kstore-search $@ ;;
secret) shift; kstore-secret $@ ;;
*)
__func_head "add [key] [value|file|-] [prop, default: $_KSTORE_DEF_PROP]"
__func_help "update [key] [value|file|-] [prop, default: $_KSTORE_DEF_PROP]"
__func_help "get [key] [prop, default: $_KSTORE_DEF_PROP]"
__func_help "del [key]"
__func_help "list"
__func_help "search [key] [prop]"
__func_help "secret ..."
__func_help "query SQL"
return 1
;;
esac
return $?
}
function kstore-secret {
case "$1" in
clear) shift; kstore-secret-clear "$@" ;;
config) shift; kstore-secret-config "$@" ;;
change) shift; kstore-secret-change "$@" ;;
*)
__func_head "clear"
__func_help "config"
__func_help "change"
;;
esac
}
function kstore-init {
cat <<___SQL___ | $_SQLITE "$_AUTH_DB"
CREATE TABLE IF NOT EXISTS store (
key TEXT NOT NULL
, prop TEXT NOT NULL
, data TEXT
, PRIMARY KEY( key ASC, prop ASC )
);
___SQL___
kstore secret config
}
function kstore-quote {
echo -n "$1" | sed -e "s/'/''/g"
}
function kstore-enc {
if [ -z "$_AUTH_SECRET" ]; then
echo "Secret key is not set yet" >&2
return 1
fi
if [ "$1" == "-" ]; then
openssl enc -e -aes-256-cbc -pbkdf2 -k "$_AUTH_SECRET" -a -A
elif [ -f "$1" ]; then
openssl enc -e -aes-256-cbc -pbkdf2 -k "$_AUTH_SECRET" -a -A -in "$1"
else
echo -n "$1" | openssl enc -e -aes-256-cbc -pbkdf2 -k "$_AUTH_SECRET" -a -A
fi
}
function kstore-dec {
if [ -z "$_AUTH_SECRET" ]; then
echo "Secret key is not set yet" >&2
return 1
fi
openssl enc -d -aes-256-cbc -pbkdf2 -k "$_AUTH_SECRET" -a -A
}
function kstore-secret-auto {
case $OSTYPE in
darwin*) kstore-secret-macos "$@" ;;
*)
echo "$OSTYPE is Not supported yet" >&2
;;
esac
}
function kstore-secret-macos {
local _A
case $1 in
get)
_A=`security find-generic-password -a default -gs rbash-kstore 2>&1 | grep ^password | cut -c 11-`
if [ $? -ne 0 ]; then
return 1
fi
_AUTH_SECRET="${_A:1:-1}"
;;
set)
security add-generic-password -a default -s rbash-kstore -w "$_AUTH_SECRET"
;;
del)
security delete-generic-password -a default -s rbash-kstore
;;
*)
echo "Unknown action: $1" >&2
return 1
;;
esac
}
function kstore-secret-windows {
# Not impelemented yet
if [ "$1" == "get" ]; then
return 1
fi
return 1
}
function kstore-secret-config {
local _CONFIRM
if [ -z "$_AUTH_SECRET" ]; then
kstore-secret-auto get
if [ -n "$_AUTH_SECRET" ]; then
return 0
fi
read -sp "Enter passphrase: " _AUTH_SECRET
echo
if [ -z "$_AUTH_SECRET" ]; then
echo "Passphrase cannot be empty" >&2
return 1
fi
read -p "Save this password to OS's keystore? (y/n): " _CONFIRM
if [ "$_CONFIRM" != "y" ]; then
return 0
fi
kstore-secret-auto set
fi
}
function kstore-secret-change {
kstore-secret-config
local _NEW_SECRET i _key _prop _O_SECRET _BAK
read -sp "Enter the new passphrase: " _NEW_SECRET
echo
read -sp "Enter the passphrase again: " i
echo
if [ "$i" != "$_NEW_SECRET" ]; then
echo "Passphrase mismatched" >&2
return 1
fi
_BAK=$( mktemp )
cp "$_AUTH_DB" "$_BAK"
echo "Backed up at $_BAK"
_O_SECRET="$_AUTH_SECRET"
for i in `$_SQLITE -list "$_AUTH_DB" "SELECT _ROWID_ FROM store;"`; do
_AUTH_SECRET=$_O_SECRET
_key=`$_SQLITE -list "$_AUTH_DB" "SELECT key FROM store WHERE _ROWID_ = $i;"`
_key=`kstore-quote "$_key"`
_prop=`$_SQLITE -list "$_AUTH_DB" "SELECT prop FROM store WHERE _ROWID_ = $i;"`
_prop=`kstore-quote "$_prop"`
_val=`kstore get "$_key" "$_prop"`
if [ $? -ne 0 ]; then
echo "Current passphrase is incorrect?" >&2
return 1
fi
_AUTH_SECRET=$_NEW_SECRET
echo Updating: [$_key] [$_prop]
kstore update "$_key" "$_val" "$_prop"
done
kstore-secret-auto get
if [ -n "$_AUTH_SECRET" ]; then
kstore-secret-auto del 2>&1 > /dev/null
_AUTH_SECRET=$_NEW_SECRET
kstore-secret-auto set
if [ $? -eq 0 ]; then
echo "New passphrase saved in OS's keystore."
fi
fi
_AUTH_SECRET=$_NEW_SECRET
}
function kstore-secret-clear {
_AUTH_SECRET=
case $OSTYPE in
darwin*)
security delete-generic-password -a default -s rbash-kstore 2>&1 > /dev/null
;;
esac
}
function kstore-update {
kstore-init || return 1
local _key _val _prop
_key=`kstore-quote "$1"`
_val=`kstore-enc "$2"`
_val=`kstore-quote "$_val"`
_prop=`kstore-quote "${3:-$_KSTORE_DEF_PROP}"`
_cond="key = '$_key' AND prop = '$_prop'"
$_SQLITE "$_AUTH_DB" "UPDATE store SET data = '$_val' WHERE $_cond;"
}
function kstore-add {
kstore-init || return 1
local _key _val _prop
_key=`kstore-quote "$1"`
_val=`kstore-enc "$2"`
_val=`kstore-quote "$_val"`
_prop=`kstore-quote "${3:-$_KSTORE_DEF_PROP}"`
sqlite3 "$_AUTH_DB" \
"INSERT INTO store ( key, prop, data )
VALUES( '$_key', '$_prop', '$_val' );"
}
function kstore-get {
kstore-init || return 1
local _key _prop _cond
_key=`kstore-quote "$1"`
_prop=`kstore-quote "${2:-$_KSTORE_DEF_PROP}"`
_cond="key = '$_key' AND prop = '$_prop'"
sqlite3 "$_AUTH_DB" "SELECT 1111 FROM store WHERE $_cond;" | grep -q 1111
if [ $? -eq 0 ]; then
$_SQLITE -list "$_AUTH_DB" "SELECT ( data ) FROM store WHERE $_cond;" | kstore-dec
else
echo "\"$1\" not found" >&2
fi
}
function kstore-del {
kstore-init || return 1
local _CONFIRM _key _prop _cond
_key=`kstore-quote "$1"`
_prop=`kstore-quote "${2:-$_KSTORE_DEF_PROP}"`
_cond="key = '$_key' AND prop = '$_prop'"
sqlite3 "$_AUTH_DB" "SELECT 1111 FROM store WHERE $_cond;" | grep -q 1111
if [ $? -eq 0 ]; then
sqlite3 "$_AUTH_DB" "SELECT * FROM store WHERE $_cond;"
echo
read -p "Delete this entry (yes/no)? " _CONFIRM
if [ "$_CONFIRM" == "yes" ]; then
sqlite3 "$_AUTH_DB" "DELETE FROM store WHERE $_cond;"
if [ $? -eq 0 ]; then
echo "deleted"
fi
else
echo "action canceled"
fi
else
echo "\"$1\" not found" >&2
fi
}
function kstore-search {
local _termk _termp _cond
_termk=`kstore-quote "$1"`
_termp=`kstore-quote "$2"`
_cond="key LIKE '%$_termk%' AND prop LIKE '%$_termp%'"
$_SQLITE -header -column "$_AUTH_DB" "SELECT key, prop, length( data ) FROM store WHERE $_cond;"
}
function kstore-list {
$_SQLITE -header -column "$_AUTH_DB" "SELECT key, prop, length( data ) FROM store;"
}
function kstore-query {
sqlite3 "$_AUTH_DB" "$@"
}

15
bash/sources/20_fast-greps Executable file
View File

@@ -0,0 +1,15 @@
#!/bin/bash
alias grepphp='grep -n --include=*.php'
alias grepjs='grep -n --include=*.js'
function grept {
if [[ -z "$1" ]]; then
__func_head "TYPE GREP_ARGS"
echo
else
CMD="grep --color=auto -n --include=*.$1"
shift
$CMD $@
fi
}

12
bash/sources/21_win-greps Executable file
View File

@@ -0,0 +1,12 @@
#!/bin/bash
function grepo {
grep --color=always "$1" . -r | awk '{ count++; print " ["count"] "$0 } '
echo -n "Select number to open: "
read num
IFS="
"
CHOICES=( `grep -n "$1" . -r | awk 'BEGIN{ FS=":" }{ print "notepad /g "$2" "$1 }'` )
bash -c ${CHOICES[$(( num - 1 ))]}
}

16
bash/sources/22_win-setups Executable file
View File

@@ -0,0 +1,16 @@
#!/bin/bash
function mkuserdirs {
local PROFILE PKG_DIR i
PROFILE=$( cygpath $USERPROFILE )
for i in $( ls $PROFILE | grep -o "^[A-Z][a-z]\+$" ); do
ln -vs "$PROFILE/$i" $HOME/
done
# Package Directory
PKG_DIR="$APPDATA/../Local/Packages"
if [ -d "$PKG_DIR" ]; then
ln -vs "$PKG_DIR" $HOME/
fi
}

33
bash/sources/23_win-vsenv Executable file
View File

@@ -0,0 +1,33 @@
#!/bin/bash
if [ -n "$FrameworkVersion" ]; then
alias vsshell='echo "FrameworkVersion $FrameworkVersion"'
return
fi
BAT_DIR=~/.local/lib/bat
mkdir -p $BAT_DIR
VS_SHELL_BAT=$BAT_DIR/vs-env.bat
function vsshell {
_SHELL=$( cygpath -w -a $VS_SHELL_BAT )
cmd /c "$_SHELL"
exit
}
if [ -f "$VS_SHELL_BAT" ]; then
_PATH=$( cygpath "$( grep -o "^@REM FILE_PATH: .\+" "$VS_SHELL_BAT" | cut -c 17- )" )
if [ -f "$_PATH" ]; then
return
fi
fi
START_MENU="$( cygpath $ProgramData )/Microsoft/Windows/Start Menu/"
_PATH=$( find "$START_MENU" -name "*Command Prompt*" | grep "Visual Studio" | grep x64 | grep Native | xargs -I % readshortcut % -r | grep -o "\"\([^\"]\+\)\"" )
echo "@echo off" > "$VS_SHELL_BAT"
echo "@REM FILE_PATH: ${_PATH:1:-1}" >> "$VS_SHELL_BAT"
echo "CALL $_PATH" >> "$VS_SHELL_BAT"
echo "START $( where mintty ) -i /Cygwin-Terminal.ico -" >> "$VS_SHELL_BAT"

82
bash/sources/30_mysql Executable file
View File

@@ -0,0 +1,82 @@
#!/bin/bash
function grepmysql {
if [[ -z "$1" ]]; then
__func_head "MySQL_SERVER_NAME [WITH_OPTIONS]"
echo
else
if [[ -z "$2" ]]; then
grep -i $1 ~/.mysql_pass | awk 'BEGIN{FS=":"}{ print $2 }'
else
grep -i $1 ~/.mysql_pass | awk 'BEGIN{FS=":"}{ print $2" "$3 }'
fi
fi
}
function mysqlo () {
if [ -z "$1" ]; then
__func_head "SERVER_NAME"
echo
else
PASS=$(grepmysql $1 true)
if [ -z "$PASS" ]; then
echo "Server not found in config: $1"
return 1
fi
PS_SQL=$(grep -i $1 ~/.mysql_pass | awk 'BEGIN{FS=":"}{ print $4 }')
USER=$(grep -i $1 ~/.mysql_pass | awk 'BEGIN{FS=":"}{ print $5 }')
export MYSQL_PS1="$PS_SQL> "
shift
echo $__mysql
mysql -u $USER --password=$PASS $@
unset PS_SQL
fi
}
function mysqls () {
if [ -z "$1" ]; then
__func_head "[z] SERVER_NAME DATABASE_NAME SQL_FILE"
echo
else
GZIP=false
PV=false
_ANY=false
if [[ "$1" == *z* ]]; then
GZIP=true
_ANY=true
fi
if [[ "$1" == *p* ]]; then
PV=true
_ANY=true
fi
if $_ANY; then
shift
fi
USER=$(grep -i $1 ~/.mysql_pass | awk 'BEGIN{FS=":"}{ print $5 }')
PASS=$(grepmysql $1 true)
if [ -z "$PASS" ]; then
echo "Server not found in config: $1"
return 1
fi
if $GZIP; then
if $PV; then
pv $3 | gunzip | mysql -u $USER --password=$PASS -D $2
else
gunzip -c $3 | mysql -u $USER --password=$PASS -D $2
fi
else
if $PV; then
pv $3 | mysql -u $USER --password=$PASS -D $2
else
mysql -u $USER --password=$PASS -D $2 < $3
fi
fi
fi
}

39
bash/sources/31_git-utils Normal file
View File

@@ -0,0 +1,39 @@
#!/bin/bash
function git-config-as {
local SHA NAME EMAIL
SHA=$1
if [ -z "$1" ]; then
SHA=HEAD
fi
NAME=$( git log $SHA -1 --pretty=format:%aN )
EMAIL=$( git log $SHA -1 --pretty=format:%ae )
git config user.name "$NAME"
git config user.email "$EMAIL"
echo "Configured as \"$NAME <$EMAIL>\""
}
function git-amend-author {
NAME=$( git config user.name )
EMAIL=$( git config user.email )
git commit --amend --no-edit --author "$NAME <$EMAIL>"
}
if [ ! -f "$HOME/.gitconfig" ]; then
cat << ___CONF___ > "$HOME/.gitconfig"
[alias]
la = log --graph --full-history --date-order --all --pretty=format:'%Cred%h%Creset %ad %C(bold blue)[%an]%Creset | %C(white)%s%Creset %C(yellow)%d%Creset' --date=relative
[color]
ui = auto
[core]
excludesfile = ~/gitignore
[push]
default = tracking
[credential]
helper = store
___CONF___
fi

248
bash/sources/40_go-command Executable file
View File

@@ -0,0 +1,248 @@
#!/bin/bash
# go command
function _begin_sel() {
local i
_selected=
_sel_len=${#_sel_args[@]}
if [ $_sel_len -gt 1 ]; then
echo "There are $_sel_len possible paths under $1@[$2]"
j=1
for i in ${_sel_args[@]}; do
echo " $j. $i"
j=$(( j + 1 ))
done
echo -n "Your choice [1-$(( j - 1 ))]: "
read num
re="^[1-$(( j - 1 ))]+\$"
if [[ ! $num =~ $re ]]; then
echo "Value does not fall into expected range"
return 1
fi
_selected=${_sel_args[$(( num - 1 ))]}
return 0
fi
_selected=${_sel_args[0]}
return 0
}
function go() {
local i
ARG1=$1; ARG2=$2; ARG3=$3;
if [[ -z "$ARG1" ]]; then
__func_head "[MODE] SITE TARGET_DIR [..SLICE]"
__func_help "up [MODE] TARGET_DIR"
__func_help "down [MODE] TARGET_DIR [..SLICE]"
echo
return 1
fi
NAV=false
case "$ARG1" in
p)
shift
CC='pushd' ;;
c)
shift
CC='cd' ;;
e)
shift
CC='echo' ;;
up|down)
shift
NAV=true ;;
*)
CC='cd'
ARG3=$ARG2
ARG2=$ARG1
;;
esac
if [ $NAV = true ]; then
__go_nav $ARG1 $@
return $?
fi
if [[ -f ~/.go_conf ]]; then
source ~/.go_conf
else
echo "Cannot source config file"
return 1
fi
_sel_args=( $( ls "$UDEV" | grep "$ARG2" ) )
_begin_sel $UDEV $ARG2
SITE=$_selected
if [[ -z "$SITE" ]]; then
echo "No such site: $ARG2"
find "$UDEV/" -maxdepth 1 -type d | sed "s/^.\+\/\([^\/]\+\)\/\?$/ \1/g"
return 1
fi
if [[ -z "$ARG3" ]]; then
$CC "$UDEV/$SITE"
return $?
fi
__SFT23=0
for ((i = 0; i < ${#LOCS[@]}; i++))
do
LOC=${LOCS[i]}
LOCATION=$(ls -d "$UDEV/$SITE/$LOC/"*"$ARG3"*/ 2> /dev/null )
if [[ -n "$LOCATION" ]]; then
NPATHS=$( echo -n "$LOCATION" | grep -c '^' )
if [[ $NPATHS -gt 1 ]]; then
# shift ARG2 ARG3
shift; shift
__SFT23=1
j=1
CHOICES=()
__CC=$CC
for i in ${LOCATION[@]}; do
__dive "test -d" "$i" $@ > /dev/null
if [[ $? -eq 0 ]]; then
__LOC="$i"
CHOICES+=($i)
j=$(( j + 1 ))
fi
done
CC=$__CC
# No possible solution for this path
if [[ $j -eq 1 ]]; then
echo "Unable to trace \"$@\" under $UDEV/$SITE/*$ARG3*/"
return 1
elif [[ $j -eq 2 ]]; then
LOCATION=$__LOC
else
_sel_args=$CHOICES
_begin_sel "$LOCATION" $@
if [ -z $_selected ]; then
return 1
fi
LOCATION=$_selected
fi
fi
break
fi
done
if [[ $__SFT23 -eq 0 ]]; then
# shift ARG2 ARG3
shift; shift
fi
if [[ -n "$LOCATION" ]]; then
__dive $CC "$LOCATION" $@
return $?
else
__dive $CC "$UDEV/$SITE" "$ARG3" $@
return $?
fi
}
__dive() {
local i
CC=$1
WDIR=$2
shift; shift
if [ -z "$*" ]; then
$CC "$WDIR"
return $?
fi
_EXCLUDE_ARGS=
if [ -n $EXCLUDE_DIRS ]; then
for i in ${EXCLUDE_DIRS[@]}; do
_EXCLUDE_ARGS="$_EXCLUDE_ARGS -path '*/$i' -prune -o -name $i -prune -o"
done
fi
OIFS=$IFS
IFS="*"
PATT="*$**"
IFS=$OIFS
pushd "$WDIR" > /dev/null
DIR=$(find . $_EXCLUDE_ARGS -path "$PATT" -type d -print -quit | cut -c 3- )
popd > /dev/null
if [[ -z $DIR ]]; then
echo "Path: $WDIR"
echo " - Pattern not found: $PATT"
return 1
fi
$CC "$WDIR/$DIR"
}
__go_nav() {
local i
ARG1=$1; ARG2=$2; ARG3=$3;
case "$ARG2" in
p)
shift
CC='pushd' ;;
c|"")
shift
CC='cd' ;;
e)
shift
CC='echo' ;;
*)
CC='cd'
ARG3=$ARG2
;;
esac
if [[ "$ARG1" == "up" ]]; then
OIFS=$IFS
IFS="/" read -a PWDA <<< "$(pwd)"
IFS=$OIFS
MARK=0
S_LEN=$(( ${#PWDA[@]} - 2 ))
for (( i=1; i<=$S_LEN; i++ ))
do
STACK=${PWDA[$i]}
if [ -z "$STACK" ]; then
continue
fi
if [ -n "$ARG3" ] && [[ "$STACK" =~ "$ARG3" ]]; then
MARK=$i
fi
done
if [ -z "$ARG3" ]; then
# Go up 1 level
MARK=$(( ${#PWDA[@]} - 2 ))
fi
if [ $MARK -eq 0 ]; then
echo "No such token in up stack: $ARG3"
for (( i=1; i<=$S_LEN; i++ )); do echo " ${PWDA[$i]}"; done
return 1
fi
DIR='/'
for (( i=1; i<=$MARK; i++ ))
do
DIR="$DIR${PWDA[$i]}/"
done
$CC "$DIR"
else
shift
__dive $CC . $@
return $?
fi
}

View File

@@ -0,0 +1,106 @@
#!/bin/bash
# Pivot: The handy diretory switch
# Examples:
# /root/a/b/c/d $ swing a k
# /root/k/b/c/d $ swing k g
# /root/g/b/c/d $ swing b f
# /root/g/f/c/d $
function pvt() {
ARG1=$1; ARG2=$2; ARG3=$3;
if [[ -z "$ARG1" ]]; then
__func_head "[MODE] PIVOT_DIR LAND_DIR"
echo
return 1
fi
case "$ARG1" in
p)
CC='pushd' ;;
c)
CC='cd' ;;
e)
CC='echo' ;;
*)
CC='cd'
ARG3=$ARG2
ARG2=$ARG1
;;
esac
if [[ -z "$ARG3" ]]; then
>&2 echo "Error: LAND_DIR is not defined"
pvt
return 1
fi
IFS="/" read -a PWDA <<< "$(pwd)"
# Begin finding dirs in up-stack
MARK=0
LISTOF=''
UP_STACK=''
for i in "${!PWDA[@]}"
do
DIR=${PWDA[$i]}
if [[ -n "$DIR" ]]; then
LISTOF="$LISTOF\n $DIR";
fi
if [[ "$DIR" =~ $ARG2 ]]; then
MARK=$i
continue
fi
if [[ $MARK -ne 0 ]]; then
UP_STACK="$UP_STACK/$DIR"
fi
done
if [[ $MARK -eq 0 ]]; then
echo "No such token in up stack: $ARG3"
echo -e $LISTOF;
echo
return 1
fi
PARENT_DIR='/'
for (( i=1; i<$MARK; i++ ))
do
PARENT_DIR="$PARENT_DIR${PWDA[$i]}/"
done
CAND=()
for i in $( find $PARENT_DIR -maxdepth 1 -type d -name "*$ARG3*" )
do
CAND+=("$i")
done
for i in "${!CAND[@]}"
do
DIR="${CAND[$i]}"
LAND_DIR="$DIR$UP_STACK"
if [[ -d "$LAND_DIR" ]]; then
$CC "$LAND_DIR"
return 0
fi
done
echo "Error: Cannot land to \"$UP_STACK\" under pivoting parent: \"$PARENT_DIR\""
echo "List of possible landings:"
for i in $( find $PARENT_DIR -maxdepth 1 -type d )
do
LAND_DIR="$i$UP_STACK"
if [[ -d "$LAND_DIR" ]]; then
echo " "$( basename $i )
fi
done
echo
return 1
}

21
bash/sources/60_diagnostics Executable file
View File

@@ -0,0 +1,21 @@
#!/bin/bash
function dumpcolors {
# Reference: https://tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html
T='gYw' # The test text
echo -e "\n 40m 41m 42m 43m\
44m 45m 46m 47m";
for FGs in ' m' ' 1m' ' 30m' '1;30m' ' 31m' '1;31m' ' 32m' \
'1;32m' ' 33m' '1;33m' ' 34m' '1;34m' ' 35m' '1;35m' \
' 36m' '1;36m' ' 37m' '1;37m';
do FG=${FGs// /}
echo -en " $FGs \033[$FG $T "
for BG in 40m 41m 42m 43m 44m 45m 46m 47m;
do echo -en "$EINS \033[$FG\033[$BG $T \033[0m";
done
echo;
done
echo
}