# note, if I use a machine I dont want files readable by all users, set
# umask 077 # If fewer than 4 digits are entered, leading zeros are assumed
-C_DEFAULT_DIR=/a
-
# i for insensitive. the rest from
# X means dont remove the current screenworth of output upon exit
# R means to show colors n things
export SYSTEMD_LESS=$LESS
# * include files
-for _x in /a/bin/distro-functions/src/* /a/bin/!(githtml)/*-function?(s); do
- source "$_x"
-done
-unset _x
-# so I can share my bashrc
-for x in /a/bin/bash_unpublished/source-!(.#*); do source $x; done
+
+# generated instead of dynamic for the benefit of shellcheck
+#for x in /a/bin/distro-functions/src/* /a/bin/!(githtml)/*-function?(s); do echo source $x ; done
+source /a/bin/distro-functions/src/identify-distros
+source /a/bin/distro-functions/src/package-manager-abstractions
+source /a/bin/distro-setup/path_add-function
+source /a/bin/ds/path_add-function
+source /a/bin/log-quiet/logq-function
+source /a/bin/small-misc-bash/ll-function
+source /a/bin/small-misc-bash/psg-function
+# for x in /a/bin/bash_unpublished/source-!(.#*); do echo source $x; done
+source /a/bin/bash_unpublished/source-semi-priv
+source /a/bin/bash_unpublished/source-state
+
+# shellcheck source=./path_add-function
source $(dirname $(readlink -f $BASH_SOURCE))/path_add-function
source /a/bin/log-quiet/logq-function
# if someone exported $SOE (stop on error), catch errors.
path_add --ifexists --end /a/opt/scancode-toolkit-3.0.2
export WCDHOME=/a
# based on readme.debian. dunno if this will break on other distros.
-_x=/usr/share/wcd/wcd-include.sh
-if [[ -e $_x ]]; then source $_x; fi
+if [[ -s /usr/share/wcd/wcd-include.sh ]]; then
+ source /usr/share/wcd/wcd-include.sh
+fi
# * aliases
# file cut copy and paste, like the text buffers :)
# I havnt tested these.
-_fbufferinit() { # internal use by
+_fbufferinit() { # internal use
! [[ $my_f_tempdir ]] && my_f_tempdir=$(mktemp -d)
- rm -rf "$my_f_tempdir"/*
+ rm -rf "${my_f_tempdir:?}"/*
}
fcp() { # file cp
_fbufferinit
_cdiff-prep() {
# join options which are continued to multiples lines onto one line
local first=true
- grep -vE '^([ \t]*#|^[ \t]*$)' "$1" | while IFS= read -r line; do
+ while IFS= read -r line; do
# remove leading spaces/tabs. assumes extglob
if [[ $line == "[ ]*" ]]; then
line="${line##+( )}"
else
pastline="$pastline $line"
fi
- done
+ done < <(grep -vE '^([ \t]*#|^[ \t]*$)' "$1")
echo "$pastline" >> "$2"
}
}
a() {
- local x=$(readlink -nf "${1:-$PWD}")
+ local x
+ x=$(readlink -nf "${1:-$PWD}")
# yes, its kinda dumb that xclip/xsel cant do this in one invocation
echo -n "$x" | xclip -selection clipboard
echo -n "$x" | xclip
caa() { git commit --amend --no-edit -a; }
caf() {
+ # shellcheck disable=SC2033
find -L $1 -type f -not \( -name .svn -prune -o -name .git -prune \
-o -name .hg -prune -o -name .editor-backups -prune \
-o -name .undo-tree-history -prune \) \
# setup for format of postfix, eg:
# option = stuff[,]
# [more stuff]
- local pastline
- local unified="$(mktemp)"
- local f1="$(mktemp)"
- local f2="$(mktemp)"
+ local pastline unified f1 f2
+ unified="$(mktemp)"
+ f1="$(mktemp)"
+ f2="$(mktemp)"
_cdiff-prep "$1" "$f1"
_cdiff-prep "$2" "$f2"
cat "$f1" "$f2" | grep -Po '^[^=]+=' | sort | uniq > "$unified"
local start=$SECONDS
local dir="$1"
inotifywait -m "$dir" -e create -e moved_to |
- while read filedir _ file; do
+ # shellcheck disable=SC2030
+ while read -r filedir _ file; do
cat "$filedir$file"
hr
calc $((SECONDS - start)) / 60
}
+# shellcheck disable=SC2032
chown() {
# makes it so chown -R symlink affects the symlink and its target.
if [[ $1 == -R ]]; then
local host
"$@"
for host in x2 tp kd; do
- ssh $host "$@"
+ ssh $host $(printf "")
done
}
# this is idempotent. the only way to identify debian sources is to
# note the original server, so we put it in a comment so we can
# identify it later.
- local file=$(mktemp -d)/f # safe way to get file name without creating one
+ local file
+ file=$(mktemp -d)/f # safe way to get file name without creating one
sudo netselect-apt -o "$file" || return 1
url=$(grep ^\\w $file | head -n1 | awk '{print $2}')
sudo cp -f /etc/apt/sources.list /etc/apt/sources.list-original
less /var/log/exim4/mainlog
}
+# shellcheck disable=SC2032
f() {
# cd forward
c +
faf() { # find all files
find -L $1 -not \( -name .svn -prune -o -name .git -prune \
-o -name .hg -prune -o -name .editor-backups -prune \
- -o -name .undo-tree-history -prune \) -type f 2>/dev/null
+ -o -name .undo-tree-history -prune \) -type f 2>/dev/null
}
# one that comes with distros is too old for newer devices
echo "$line" >> "$m"
msize=$((msize + 1))
fi
- done < <(find -type f )
+ done < <(find . -type f )
if $missing; then
echo "$m"
(( msize <= 100 )) && cat $m
echo nok > b
mkdir c
echo ok > c/d
- local x=$(mktemp -d)
+ local x
+ x=$(mktemp -d)
mkdir $x/c
echo different > $x/c/d
echo ok > $x/a
if [[ -d $1 ]]; then
echo "$1"
else
- local dir="$(dirname "$1")"
+ local dir
+ dir="$(dirname "$1")"
if [[ -d $dir ]]; then
echo "$dir"
else
git_empty_branch() { # start an empty git branch. carefull, it deletes untracked files.
[[ $# == 1 ]] || { echo 'need a branch name!'; return 1;}
- local gitroot
- gitroot || return 1 # function to set gitroot
- builtin cd "$gitroot"
+ local root
+ root=$(gitroot) || return 1 # function to set gitroot
+ builtin cd "$root"
git symbolic-ref HEAD refs/heads/$1
rm .git/index
git clean -fdx
}
+# shellcheck disable=SC2120
gitroot() {
local help="Usage: gitroot [--help]
Print the full path to the root of the current git repo
echo "$help"
return
fi
- local p=$(git rev-parse --git-dir) || { echo "error: not in a git repo" ; return 1; }
+ local p
+ p=$(git rev-parse --git-dir) || { echo "error: not in a git repo" ; return 1; }
[[ $p != /* ]] && p=$PWD
echo "${p%%/.git}"
}
gh() {
# i got an error, gh not found when doing a pull request, it seems like it wants itself in it\'s path.
local _oldpath="$PATH"
- PATH="$PATH:~/node_modules/.bin"
+ PATH="$PATH:$HOME/node_modules/.bin"
command gh "$@"
PATH="$_oldpath"
}
hstatus() {
# do git status on published repos
cd /a/bin/githtml
- do_hr=false
for x in *; do
- cd `readlink -f $x`/..
+ cd $(readlink -f $x)/..
status=$(i status -s) || pwd
if [[ $status ]]; then
hr
hl() { # history limit. Write extra history to archive file.
# todo: this is not working or not used currently
- local max_lines linecount tempfile prune_lines x
+ local max_lines linecount prune_lines x
local harchive="${HISTFILE}_archive"
for x in "$HISTFILE" "$harchive"; do
[[ -e $x ]] || { touch "$x" && echo "notice from hl(): creating $x"; }
- if [[ ! $x || ! -e $x || ! -w $x || $(stat -c "%u" "$x") != $EUID ]]; then
+ if [[ ! $x || ! -e $x || ! -w $x || $(stat -c "%u" "$x") != "$EUID" ]]; then
echo "error in hl: history file \$x:$x no good"
return 1
fi
[[ $max_lines =~ ^[0-9]+$ ]] || { echo "error in hl: failed to get max line count"; return 1; }
linecount=$(wc -l < $HISTFILE) # pipe so it doesnt output a filename
[[ $linecount =~ ^[0-9]+$ ]] || { echo "error in hl: wc failed"; return 1; }
- if (($linecount > $max_lines)); then
- prune_lines=$(($linecount - $max_lines))
+ if ((linecount > max_lines)); then
+ prune_lines=$((linecount - max_lines))
head -n $prune_lines "$HISTFILE" >> "$harchive" \
&& sed --follow-symlinks -ie "1,${prune_lines}d" $HISTFILE
fi
local x
for x in "$@"; do
if [[ ${x::1} == [A-Z] ]]; then
- y=$(tr "[A-Z]" "[a-z]" <<<"${x::1}")"${x:1}"
+ y=$(tr '[:upper:]' '[:lower:]' <<<"${x::1}")"${x:1}"
safe_rename "$x" "$y" || return 1
fi
done
}
mbenable() {
- mb=$1
- dst=/m/4e/$1
- src=/m/md/$1
+ local mb=$1
+ dst=/m/4e/$mb
+ src=/m/md/$mb
set -x
[[ -e $src ]] || { set +x; return 1; }
mv -T $src $dst || { set +x; return 1; }
set +x
}
mbdisable() {
- mb=$1
- dst=/m/md/$1
- src=/m/4e/$1
+ local mb=$1
+ dst=/m/md/$mb
+ src=/m/4e/$mb
set -x
[[ -e $src ]] || { set +x; return 1; }
if [[ -L $dst ]]; then rm $dst; fi
}
mkct() {
- mkc `mktemp -d`
+ mkc $(mktemp -d)
}
mkt() { # mkdir and touch file
touch "$path"
}
+# shellcheck disable=SC2032
mkdir() { command mkdir -p "$@"; }
mo() { xset dpms force off; } # monitor off
}
nopanic() {
+ # shellcheck disable=SC2024
sudo tee -a /var/log/exim4/paniclog-archive </var/log/exim4/paniclog; sudo truncate -s0 /var/log/exim4/paniclog
}
}
pkx() { # package extract
- c `mktemp -d`
+ local pkg cached tmp f
+ c $(mktemp -d)
pkg=$1
+ # shellcheck disable=SC2012
cached=$(ls -t /var/cache/apt/archives/$pkg* | tail -n1)
if [[ $cached ]]; then
cp $cached .
else
aptitude download $pkg
fi
- f=(*)
+ tmp=(*); f=${tmp[0]} # only 1 expected
ex $f
rm -f $f
}
pid=($(pgrep -f "$*"))
case ${#pid[@]} in
1)
- ps -F $pid
- m kill $pid
+ # shellcheck disable=SC2128
+ {
+ ps -F $pid
+ m kill $pid
+ }
;;
0) echo "no pid found" ;;
*)
while name="$( echo | restore-trash | gr "$PWD/[^/]\+$" | gr "$1" )" \
&& [[ $name ]] && (( $(wc -l <<<"$name") >= nth )); do
name="$(echo "$name" | head -n $nth | tail -n 1 )"
- read -p "$name [Y/n] " ask
+ read -r -p "$name [Y/n] " ask
if [[ ! $ask || $ask == [Yy] ]]; then
x=$( echo "$name" | gr -o "^\s*[0-9]*" )
echo $x | restore-trash > /dev/null
"$@" &> /dev/null &
}
+# shellcheck disable=SC2120
r() {
history -a # save history
- exit "$@"
+ exit ${1:0}
# i had this redir, not sure why
-# exit "$@" 2>/dev/null
+ # exit "$@" 2>/dev/null
}
rbpipe() { rbt post -o --diff-filename=- "$@"; }
# eg. rlu -opts frodo /testpath
# relative paths will expanded with readlink -f.
opts=("${@:1:$#-2}") # 1 to last -2
- path="${@:$#}" # last
- host="${@:$#-1:1}" # last -1
+ path="${*:$#}" # last
+ host="${*:$#-1:1}" # last -1
if [[ $path == .* ]]; then
path=$(readlink -f $path)
fi
rspicy() { # usage: HOST DOMAIN
# connect to spice vm remote host. use vspicy for local host
- local port=$(ssh $1<<EOF
+ local port
+ # shellcheck disable=SC2087
+ port=$(ssh $1<<EOF
sudo virsh dumpxml $2|grep "<graphics.*type='spice'" | \
sed -rn "s/.*port='([0-9]+).*/\1/p"
EOF
echo safe_rename error: $# args, need 2 >2
return 1
fi
- if [[ $1 != $2 ]]; then # yes, we want to silently ignore this
+ if [[ $1 != "$2" ]]; then # yes, we want to silently ignore this
if [[ -e $2 || -L $2 ]]; then
echo "Cannot rename $1 to $2 as it already exists."
else
}
sk() {
- # 2086 = unquoted $var
- # 2046 = unquoted $(cmd)
+ # 2086: unquoted $var
+ # 2046: unquoted $(cmd)
# 2068: Double quote array expansions to avoid re-splitting elements.
+ # 2119: Functions with optional args get bad warnings when none are passed.
+ # 2033: too many false positives for thing that will never work, passing shell function to find.
# i had -x as an arg, but debian testing(stretch) doesn\'t support it
- shellcheck -x -e 2086,2046,2068 "$@"
+ shellcheck -x -e 2086,2046,2068,2119,2033 "$@"
# had this before. not sure what it is 2119
}
skaraoke() {
local tmp out
- in="$1"
out=${2:-${1%.*}.sh}
tmp=$(mktemp -d)
script -t -c "mpv --no-config --no-resume-playback --no-terminal --no-audio-display '$1'" $tmp/typescript 2>$tmp/timing
t ) do_stamp=true ;;
esac
done
- shift $(($OPTIND - 1))
+ shift $((OPTIND - 1))
arg_base+=$1
[[ -e $logdir ]] || mkdir -p $logdir
$do_stamp && arg_base+=$(date +%F.%T%z)
srun() {
scp $2 $1:/tmp
- ssh $1 /tmp/${2##*/} "${@:2}"
+ ssh $1 /tmp/${2##*/} $(printf "%q\n" "${@:2}")
}
ssh() {
args+=("$x")
fi
done
- [[ ! ${args[@]} ]] || trash-put "${args[@]}"
+ (( ! ${#args[@]} )) || trash-put "${args[@]}"
else
rm -rf "$@"
fi
tclock() {
+ local x
clear
date +%l:%_M
len=60
tm() {
# timer in minutes
# --no-config
- (sleep $(calc "$@ * 60") && mpv --no-config --volume 50 /a/bin/data/alarm.mp3) > /dev/null 2>&1 &
+ (sleep $(calc "$* * 60") && mpv --no-config --volume 50 /a/bin/data/alarm.mp3) > /dev/null 2>&1 &
}
trg() { transmission-remote-gtk&r; }
tu() {
- local s;
- local dir="$(dirname "$1")"
+ local s dir
+ dir="$(dirname "$1")"
if [[ -e $1 && ! -w $1 || ! -w $(dirname "$1") ]]; then
s=s;
fi
netns=$1
ps -w | head -n 1
s find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/$netns | cut -d/ -f5 | \
- while read l; do
+ while read -r l; do
x=$(ps -w --no-headers -p $l);
if [[ $x ]]; then echo "$x"; else echo $l; fi;
done
}
vm-set-listen(){
- local t=$(mktemp)
+ local t
+ t=$(mktemp)
local vm=$1
local ip=$2
s virsh dumpxml $vm | sed -r "s/(<listen.*address=')([^']+)/\1$ip/" | \
if ${use_color} && [[ $- == *i* ]]; then
- term_underl="$(tput smul)"
- term_bold="$(tput bold)"
- term_red="$(tput setaf 1)"
- term_green="$(tput setaf 2)"
- term_blue="$(tput setaf 4)"
- term_cyan="$(tput setaf 6)"
- term_yellow="$(tput setaf 3)"
- term_purple="$(tput setaf 5)"
- term_nocolor="$(tput sgr0)" # no font attributes
+ term_bold="$(tput bold)"
+ term_red="$(tput setaf 1)"
+ term_green="$(tput setaf 2)"
+ term_yellow="$(tput setaf 3)"
+ term_purple="$(tput setaf 5)"
+ term_nocolor="$(tput sgr0)" # no font attributes
+
+ # unused so far. commented for shellcheck
+ # term_underl="$(tput smul)"
+ # term_blue="$(tput setaf 4)"
+ # term_cyan="$(tput setaf 6)"
fi
# Try to keep environment pollution down, EPA loves us.
if [[ $- == *i* ]]; then
- # git branch/status prompt function
- if [[ $OS != Windows_NT ]]; then
- GIT_PS1_SHOWDIRTYSTATE=true
- fi
- # arch source lopip show -fcation
- [[ -r /usr/share/git/git-prompt.sh ]] && source /usr/share/git/git-prompt.sh
- # fedora/debian source
- [[ -r /usr/share/git-core/contrib/completion/git-prompt.sh ]] && source /usr/share/git-core/contrib/completion/git-prompt.sh
-
- # in case we didnt source git-prompt.sh
- if ! declare -f __git_ps1 > /dev/null; then
- __git_ps1() {
- :
- }
- fi
# this needs to come before next ps1 stuff
# this stuff needs bash 4, feb 2009,
# so I've thrown a bunch of things at the wall to speed it up.
prompt-command() {
local return=$? # this MUST COME FIRST
- local psc pst ps_char ps_color stale_subvol
+ local ps_char ps_color
unset IFS
history -a # save history
# faster than sourceing the file im guessing
eval $(< /dev/shm/iank-status)
- if [[ ! $SSH_CLIENT && $MAIL_HOST != $HOSTNAME ]]; then
+ if [[ ! $SSH_CLIENT && $MAIL_HOST != "$HOSTNAME" ]]; then
ps_char="@ $ps_char"
fi
PS1="${PS1%"${PS1#*[wW]}"} \[$ps_color\]$ps_char\[$term_nocolor\] "
else
local title_escape="\033]0;"
fi
- if [[ $* != prompt-command ]]; then
+ if [[ $0 != prompt-command ]]; then
echo -ne "$title_escape$USER@$HOSTNAME ${PWD/#$HOME/~} "
printf "%s" "$*"
echo -ne "\007"
}
reset-sakura() {
- while read k v; do
+ while -r read k v; do
+ # shellcheck disable=SC2154
setini $k $v sakura /a/c/subdir_files/.config/sakura/sakura.conf
done <<'EOF'
colorset1_back rgb(33,37,39
if [[ "$SUDOD" ]]; then
cd "$SUDOD"
unset SUDOD
-elif [[ -d /a ]] && [[ $PWD == $HOME ]] && [[ $- == *i* ]]; then
+elif [[ -d /a ]] && [[ $PWD == "$HOME" ]] && [[ $- == *i* ]]; then
cd /a
fi
echo "error: dont be root. make sure pyenv is installed"
return 1
fi
- export PATH="~/.pyenv/bin:$PATH"
+ export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
}
# taken from default changes to bashrc and bash_profile
path_add --end $HOME/.rvm/bin
+
+# shellcheck disable=SC1090
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
export BASEFILE_DIR=/a/bin/fai-basefiles