X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=brc;h=5df2c27211dd13c6c8acb7239a2d71ea8fdef1e7;hb=b1c29177fe76f8f2a557f7f36c987df3ef2a6cb4;hp=bf8548f11dee9c65259cbca9395dd6eea1c311eb;hpb=f7eaad64a7c5f3bc851f146e1f258d34f398a7d7;p=distro-setup diff --git a/brc b/brc index bf8548f..5df2c27 100644 --- a/brc +++ b/brc @@ -26,9 +26,7 @@ unalias -a shopt -s extglob # include .files when globbing, but ignore files name . and .. # setting this also sets dotglob. -# Note, this doesnt work in bash 4.4 anymore, for paths with -# more than 1 directory, like a/b/.foo, since * is fixed to not match / -export GLOBIGNORE=*/.:*/.. +export GLOBIGNORE="*/.:*/.." # broken with bash_completion package. Saw a bug for this once. dont anymore. # still broken in wheezy @@ -61,7 +59,7 @@ shopt -s cmdhist shopt -s globstar -# inside emcas fixes +# inside emacs fixes if [[ $RLC_INSIDE_EMACS ]]; then # EMACS is used by bash on startup, but we dont need it anymore. # plus I hit a bug in a makefile which inherited it @@ -96,6 +94,19 @@ if [[ $RLC_INSIDE_EMACS ]]; then fi +# emacs has a different default search path than the info command. This +# adds the info defaults to emacs, but not the reverse, because I dun +# care much about the cli. The search path is only on the cli if you run +# "info xxx", or in emacs if you run '(info xxx)', so not that +# important, but might as well fix it. + +# info info says this path is what was compiled, and its not documented +# anywhere. Through source grepping, i found it in filesys.h of the info +# source in trisquel flidas. +# +# Traling : means for emacs to add its own stuff on to the end. + +export INFOPATH=$PATH:/usr/local/info:/usr/info:/usr/local/lib/info:/usr/lib/info:/usr/local/gnu/info:/usr/local/gnu/lib/info:/usr/gnu/info:/usr/gnu/lib/info:/opt/gnu/info:/usr/share/info:/usr/share/lib/info:/usr/local/share/info:/usr/local/share/lib/info:/usr/gnu/lib/emacs/info:/usr/local/gnu/lib/emacs/info:/usr/local/lib/emacs/info:/usr/local/emacs/info:.: if [[ $- == *i* ]]; then # for readline-complete.el @@ -109,7 +120,7 @@ if [[ $- == *i* ]]; then if [[ $KONSOLE_PROFILE_NAME ]]; then TERM=xterm-256color - fi + fi # todo: not sure this works in sakura #stty werase undef @@ -166,8 +177,6 @@ export PROFILE_TASKS_TASK_OUTPUT_LIMIT=100 # 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 @@ -175,12 +184,21 @@ export LESS=RXi 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. @@ -208,8 +226,9 @@ path_add --ifexists --end /a/opt/adt-bundle*/tools /a/opt/adt-bundle*/platform-t 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 @@ -250,9 +269,9 @@ unalias ls ll grep &>/dev/null ||: # 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 @@ -276,7 +295,7 @@ complete -F _longopt la lower low rlt rld rl lld ts ll dircp ex fcp fct fpst gr _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##+( )}" @@ -290,7 +309,7 @@ _cdiff-prep() { else pastline="$pastline $line" fi - done + done < <(grep -vE '^([ \t]*#|^[ \t]*$)' "$1") echo "$pastline" >> "$2" } @@ -323,7 +342,8 @@ khcopy() { } 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 @@ -371,19 +391,19 @@ b() { bbk() { c / local active=true - if systemctl is-active btrbk.service; then - echo "cron btrbk is already running" - return 1 - fi systemctl is-active btrbk.timer || active=false if $active; then ser disable btrbk.timer fi + if systemctl is-active btrbk.service; then + $active && ser enable btrbk.timer + echo "cron btrbk is already running" + return 1 + fi # run latest install-my-scripts - if ! btrbk-run "$@" && $active; then - ser enable btrbk.timer - fi + btrbk-run "$@" + $active && ser enable btrbk.timer } bfg() { java -jar /a/opt/bfg-1.12.14.jar "$@"; } @@ -454,6 +474,7 @@ fi 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 \) \ @@ -484,10 +505,10 @@ cdiff() { # 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" @@ -519,7 +540,8 @@ cat-new-files() { 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 @@ -528,6 +550,7 @@ cat-new-files() { } +# shellcheck disable=SC2032 chown() { # makes it so chown -R symlink affects the symlink and its target. if [[ $1 == -R ]]; then @@ -568,7 +591,7 @@ da() { # do all local host "$@" for host in x2 tp kd; do - ssh $host "$@" + ssh $host $(printf "") done } @@ -587,7 +610,8 @@ debian_pick_mirror () { # 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 @@ -615,6 +639,12 @@ dus() { # du, sorted, default arg of e() { echo "$@"; } +# echo var. print var including escapes, etc +ev() { + printf "%qEOL\n" "${!1}" + printf "%s" "${!1}" |& hexdump -C +} + ediff() { [[ ${#@} == 2 ]] || { echo "error: ediff requires 2 arguments"; return 1; } @@ -633,9 +663,13 @@ envload() { # load environment from a previous: export > file # mail related etail() { - sudo tail -F /var/log/exim4/mainlog -n 50 + tail -F /var/log/exim4/mainlog -n 200 +} +eless() { + less /var/log/exim4/mainlog } +# shellcheck disable=SC2032 f() { # cd forward c + @@ -653,7 +687,7 @@ fa() { 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 @@ -807,7 +841,7 @@ fsdiff () { echo "$line" >> "$m" msize=$((msize + 1)) fi - done < <(find -type f ) + done < <(find . -type f ) if $missing; then echo "$m" (( msize <= 100 )) && cat $m @@ -823,7 +857,8 @@ fsdiff-test() { 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 @@ -909,7 +944,8 @@ Output the directory of PATH, or just PATH if it is a directory." if [[ -d $1 ]]; then echo "$1" else - local dir="$(dirname "$1")" + local dir + dir="$(dirname "$1")" if [[ -d $dir ]]; then echo "$dir" else @@ -921,14 +957,15 @@ Output the directory of PATH, or just PATH if it is a directory." 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 @@ -939,7 +976,8 @@ and works in older versions of git which did not have that." 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}" } @@ -951,7 +989,7 @@ gitian() { 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" } @@ -998,9 +1036,8 @@ rg() { 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 @@ -1013,11 +1050,11 @@ hstatus() { 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 @@ -1027,8 +1064,8 @@ hl() { # history limit. Write extra history to archive file. [[ $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 @@ -1105,14 +1142,14 @@ ifn() { } - o() { - if type gvfs-open &> /dev/null ; then - gvfs-open "$@" - else - xdg-open "$@" - fi - # another alternative is run-mailcap - } +o() { + if type gvfs-open &> /dev/null ; then + gvfs-open "$@" + else + xdg-open "$@" + fi + # another alternative is run-mailcap +} ipdrop() { s iptables -A INPUT -s $1 -j DROP @@ -1199,7 +1236,7 @@ lower() { # make first letter of filenames lowercase. 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 @@ -1221,9 +1258,9 @@ make-targets() { } 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; } @@ -1233,9 +1270,9 @@ mbenable() { 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 @@ -1256,7 +1293,7 @@ mkc() { } mkct() { - mkc `mktemp -d` + mkc $(mktemp -d) } mkt() { # mkdir and touch file @@ -1265,6 +1302,7 @@ mkt() { # mkdir and touch file touch "$path" } +# shellcheck disable=SC2032 mkdir() { command mkdir -p "$@"; } mo() { xset dpms force off; } # monitor off @@ -1294,6 +1332,7 @@ ngo() { } nopanic() { + # shellcheck disable=SC2024 sudo tee -a /var/log/exim4/paniclog-archive = 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 @@ -1421,8 +1465,12 @@ q() { # start / launch a program in the backround and redir output to null "$@" &> /dev/null & } +# shellcheck disable=SC2120 r() { - exit "$@" 2>/dev/null + history -a # save history + exit ${1:0} + # i had this redir, not sure why + # exit "$@" 2>/dev/null } rbpipe() { rbt post -o --diff-filename=- "$@"; } @@ -1466,11 +1514,9 @@ rlt() { rlu() { # [OPTS] HOST PATH # eg. rlu -opts frodo /testpath # relative paths will expanded with readlink -f. - # useful for selectively sending dirs which have been synced with unison, - # where the path is the same on both hosts. 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 @@ -1502,7 +1548,9 @@ r2e() { command r2e -d /p/c/rss2email.json -c /p/c/rss2email.cfg "$@"; } rspicy() { # usage: HOST DOMAIN # connect to spice vm remote host. use vspicy for local host - local port=$(ssh $1<$tmp/timing @@ -1670,7 +1724,7 @@ slog() { 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) @@ -1710,7 +1764,7 @@ srm () { srun() { scp $2 $1:/tmp - ssh $1 /tmp/${2##*/} "${@:2}" + ssh $1 /tmp/${2##*/} $(printf "%q\n" "${@:2}") } ssh() { @@ -1747,7 +1801,7 @@ t() { args+=("$x") fi done - [[ ! ${args[@]} ]] || trash-put "${args[@]}" + (( ! ${#args[@]} )) || trash-put "${args[@]}" else rm -rf "$@" fi @@ -1755,6 +1809,7 @@ t() { tclock() { + local x clear date +%l:%_M len=60 @@ -1827,7 +1882,7 @@ testsieve() { _dosieve ~/sieve/maintest.sieve ${1:-INBOX} delete } runsieve() { - c ~/sieve; cp personal{test,}.sieve; cp lists{test,}.sieve + c ~/sieve; cp personal{test,}.sieve; cp lists{test,}.sieve; cp personalend{test,}.sieve _dosieve ~/sieve/main.sieve -eW ${1:-INBOX} delete } @@ -1872,7 +1927,7 @@ tk() { 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; } @@ -1884,8 +1939,8 @@ trc() { 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 @@ -1921,7 +1976,7 @@ psnetns() { 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 @@ -1929,7 +1984,6 @@ psnetns() { m() { printf "%s\n" "$*"; "$@"; } - vpncmd() { #m s nsenter -t $(pgrep -f "/usr/sbin/openvpn .* --config /etc/openvpn/.*pia.conf") -n -m "$@" m s nsenter -t $(pgrep -f "/usr/sbin/openvpn .* --config /etc/openvpn/.*client.conf") -n -m "$@" @@ -1951,7 +2005,8 @@ virshrm() { } vm-set-listen(){ - local t=$(mktemp) + local t + t=$(mktemp) local vm=$1 local ip=$2 s virsh dumpxml $vm | sed -r "s/( /dev/null; then - __git_ps1() { - : - } - fi # this needs to come before next ps1 stuff # this stuff needs bash 4, feb 2009, @@ -2148,47 +2162,39 @@ if [[ $- == *i* ]]; then PS1="\h $PS1" fi + # emacs terminal has problems if this runs slowly, + # 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 - - case $return in - 0) ps_color="$(get_term_color purple)" + 0) ps_color="$term_purple" ps_char='\$' ;; - 1) ps_color="$(get_term_color green)" + 1) ps_color="$term_green" ps_char="$return \\$" ;; - *) ps_color="$(get_term_color yellow)" + *) ps_color="$term_yellow" ps_char="$return \\$" ;; esac if [[ ! -O . ]]; then # not owner if [[ -w . ]]; then # writable - ps_color="$(get_term_color bold red)" + ps_color="$term_bold$term_red" else - ps_color="$(get_term_color bold green)" + ps_color="$term_bold$term_green" fi fi - # I would set nullglob, but bash has had bugs where that - # doesnt work if not in top level. - if [[ -e /nocow/btrfs-stale ]] && ((`command ls -AUq /nocow/btrfs-stale|wc -l`)); then - ps_char="! $ps_char" - fi - if [[ -e /nocow/mailtest-failure ]]; then - ps_char="@#$@#$ $ps_char" - fi - source /a/bin/bash_unpublished/source-state - if [[ ! $SSH_CLIENT && $MAIL_HOST != $HOSTNAME ]]; then + + # faster than sourceing the file im guessing + eval $(< /dev/shm/iank-status) + if [[ ! $SSH_CLIENT && $MAIL_HOST != "$HOSTNAME" ]]; then ps_char="@ $ps_char" fi - PS1="${PS1%"${PS1#*[wW]}"} \[$ps_color\]$ps_char\[$(get_term_color nocolor)\] " - # emacs completion doesnt like the git prompt atm, so disabling it. - #PS1="${PS1%"${PS1#*[wW]}"}$(__git_ps1 ' (%s)') \[$ps_color\]$ps_char\[$(get_term_color nocolor)\] " + PS1="${PS1%"${PS1#*[wW]}"} \[$ps_color\]$ps_char\[$term_nocolor\] " } PROMPT_COMMAND=prompt-command @@ -2198,7 +2204,7 @@ if [[ $- == *i* ]]; then 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" @@ -2227,7 +2233,8 @@ reset-konsole() { } 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 @@ -2266,7 +2273,7 @@ EOF if [[ "$SUDOD" ]]; then cd "$SUDOD" unset SUDOD -elif [[ -d /a ]] && [[ $PWD == $HOME ]] && [[ $- == *i* ]]; then +elif [[ -d /a ]] && [[ $PWD == "$HOME" ]] && [[ $- == *i* ]]; then cd /a fi @@ -2285,7 +2292,7 @@ mypyenvinit () { 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 -)" } @@ -2309,6 +2316,8 @@ path_add --end $HOME/.cargo/bin # 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