tags: #bash #bashrc #linux #gnu #shell See [[my bashrc]]. I organise my `bashrc` stuff into `.stuff` files. Some of these define functions and aliases. (For reference, the command I use to compile the following is ```bash for s in *.stuff; do echo -e "\`$s\`\n\`\`\`bash"; cat "$s"; echo -e '```' "\n"; done | pc ``` where `pc` is my os-specific 'copy to clipboard' command. `aliases.stuff` ```bash alias n='nvim' ``` `antlr.stuff` ```bash export CLASSPATH=".:/usr/local/lib/antlr-4.11.1-complete.jar:$CLASSPATH" alias antlr4='java -jar /usr/local/lib/antlr-4.11.1-complete.jar' alias grun='java org.antlr.v4.gui.TestRig' ``` `browser.stuff` ```bash export BROWSER=google-chrome ``` `cd.stuff` ```bash alias cd..='cd ..' alias cd...='cd ../..' alias cd....='cd ../../..' alias cd..3='cd ../../..' alias cd..4='cd ../../../..' alias cd..5='cd ../../../../..' alias ..='cd ..' alias ...='cd ../..' alias ..3='cd ../../..' alias ..4='cd ../../../..' alias ..5='cd ../../../../..' alias ls..='ls ..' up() { local I="$1"; ((I=I)); while ((I>0)); do cd ..; ((I--)); done; } pcwd() { pwd | pc; } alias ppd=pcwd cdpp() { cd "$(pp)"; } cdt() { local today="$(today)" echo "$today"; if [ -d "$today" ]; then cd "$today" fi } mkt() { local today="$(today)" echo "$today"; mkdir -p "$today" } today() { local A="${1-/}" date +"%Y$A%m$A%d" } ``` `completion.stuff` ```bash if ! shopt -oq posix; then if [ -f /usr/share/bash-completion/bash_completion ]; then . /usr/share/bash-completion/bash_completion elif [ -f /etc/bash_completion ]; then . /etc/bash_completion fi fi . tmx_completion.stuff . newhtml_completion.stuff complete -c viw catw batw lessw ``` `conda.stuff` ```bash # >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! __conda_setup="$('/home/john/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "$__conda_setup" else if [ -f "/home/john/anaconda3/etc/profile.d/conda.sh" ]; then . "/home/john/anaconda3/etc/profile.d/conda.sh" else export PATH="/home/john/anaconda3/bin:$PATH" fi fi unset __conda_setup # <<< conda initialize <<< ``` `cygwin.stuff` ```bash # nothing to do on *nix ``` `dircolors.stuff` ```bash # enable color support of ls and also add handy aliases if [ -x /usr/bin/dircolors ]; then eval "$(dircolors -b)" test -r /etc/dircolors.system && eval "$(dircolors -b /etc/dircolors.system)" test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" 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 ``` `dot_commands.stuff` ```bash alias .w=cmdwhich cmdwhich() { # .w cat a b c # becomes cat $(which a) $(which b) $(which c) # .w head -n1 -- a b c # becomes head -n1 $(which a) $(which b) $(which c) # in amy case, switches are passed through if they don't match a command [ -z "$1" ] && { echo "cmdwhich CMD [cmd cmd ...] where CMD must be nonempty" ; return ; } local A=() local B=() local S=n local CMD="$1" shift for s; do #echo "s=$s" if [ "$s" = "--" ]; then echo "==" S=y B=("${A[@]}") A=() continue fi if [ "${s:0:1}" = "-" ]; then A+=("$s") else local W="$(which "$s")" if [ -x "$W" ]; then A+=("$W") else echo "$1 not found" fi fi done "$CMD" "${B[@]}" "${A[@]}" } ``` `filecmds.stuff` ```bash # I have rs aliased to "rsync -haux --progress" and on more than one occasion I've typed # rm list-of-files-to-sync target:dir/ # and deleted what I wanted to sync. Making the remove command "remove" prevents this sort of accident. alias remove=/bin/rm rm() { echo "To delete for real, use" echo "remove $*" } mvt() { local T="$1" shift if [ ! -d "$T" ]; then echo "$T" is not a directory return 1 fi mv -t "$T" "$@" } ``` `hist.stuff` ```bash histv() { shopt -s histverify; } nohistv() { shopt -u histverify; } histv shopt -s histappend # utility for putting markers in history setmark() { if [ -n "$1" ]; then export MARK="$1"; elif [ -n "$MARK" ]; then echo "Mark: $MARK"; else echo "No mark defined"; fi; } histmark() { if [ -n "$MARK" ]; then history | awk "BEGIN { x = 0; } /===$MARK===/ { print \"Mark Found\n\"; x = 1; } { if( x == 1) print; }" else echo "No mark defined" fi } mark() { if [ -n "$1" ]; then setmark "$1"; fi if [ -n "$MARK" ]; then history -s "echo '===$MARK==='" else echo "No mark defined" fi } h() { history | grep "$@"; } ``` `mpd.stuff` ```bash setmus() { local H="${1-t420b}" P="${2-6600}" if [ -n "$H" ]; then export MPD_HOST="$H" export MPD_PORT="$P" fi } setmus ``` `mvdesc.stuff` ```bash findmnt_target() { tgt="$(findmnt -n -o target "$1")" } findmnt_of() { local a="$(readlink -f "$1")" local tgt findmnt_target "$a" while [ "$tgt" = "" ]; do a="$(dirname "$a")" findmnt_target "$a" done echo "$tgt" } mvdesc() { local r d mnt r="$(findmnt_of .)" if [ "$r" = "/" ]; then d="$HOME/descriptions" else d="$r/descriptions" fi echo "Moving descriptions to $d" if exists *.description; then mkdir -p "$d" mv -nv -t "$d" *.description fi } ``` `my.stuff` ```bash if [ -f "$HOME/bin/my_stuff" ]; then . "$HOME/bin/my_stuff" elif [ -d "$HOME/bin/my_stuff" ]; then for s in "$HOME/bin/my_stuff/*.stuff"; do . "$s" done fi ``` `newhtml_completion.stuff` ```bash #!/bin/bash _newhtml_completions() { COMPREPLY=() local CURWORD="${COMP_WORDS[COMP_CWORD]}" local WORDS=() while read -r line do WORDS+=("$line") done < <(newhtml -l) #echo "\n\nCURWORD=$CURWORD\nCWORD=$COMP_CWORD\nWORDS=${WORDS[@]}\n\n" if ((COMP_CWORD == 1)); then COMPREPLY=($(compgen -W "${WORDS[*]}" -- "$CURWORD")) else COMPREPLY=() fi } complete -F _newhtml_completions newhtml ``` `nvm.stuff` ```bash NVM_DIR="$HOME/.nvm" if [ -d "$HOME/.nvm" ]; then export NVM_DIR [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion else unset NVM_DIR fi ``` `pathif.stuff` ```bash pathif() { local APPEND=n for s; do if [ "$s" = "-a" ]; then APPEND=y elif [ "$s" = "-p" ]; then APPEND=n fi if [ ! -d "$s" ]; then continue; fi if [ "$APPEND" = "y" ]; then PATH="$PATH:$s" else PATH="$s:$PATH" fi done local TMPATH="$PATH" [ -x /usr/local/bin/tidypath ] && PATH="$(/usr/local/bin/tidypath -c "$PATH")" export PATH } ``` `perl.stuff` ```bash unset PERL5LIB; unset PERL_LOCAL_LIB_ROOT; PERL_MB_OPT="--install_base \"/home/john/perl5\""; export PERL_MB_OPT; PERL_MM_OPT="INSTALL_BASE=/home/john/perl5"; export PERL_MM_OPT; ``` `python.stuff` ```bash alias p='python' alias pip='python -m pip' ``` `shopt.stuff` ```bash shopt -s extglob set -o noclobber shopt -s histverify ``` `stuff_completion.stuff` ```bash #!/bin/bash _stuff_completions() { COMPREPLY=() #echo #echo "COMP_WORDS=" "${COMP_WORDS[@]}" #echo "COMP_CWORD=" "${COMP_CWORD}" #echo "COMP_LINE=" "${COMP_LINE}" local CURWORD="${COMP_WORDS[COMP_CWORD]}" local WORDS=() while read -r line do WORDS+=("$line") done < <(cd /usr/jda/stuff; ls *.stuff | cut -f1 -d.) COMPREPLY=($(compgen -W "${WORDS[*]}" -- "$CURWORD")) } complete -F _stuff_completions .stuff complete -F _stuff_completions .s ``` `sudo.stuff` ```bash alias setfacl='sudo /usr/bin/setfacl' alias getfacl='sudo /usr/bin/getfacl' reload() { sudo systemctl reload "$@"; } ``` `tmx_completion.stuff` ```bash #!/bin/bash _tmx_completions() { COMPREPLY=() local CURWORD="${COMP_WORDS[COMP_CWORD]}" local WORDS=() if tmux list-sessions >& /dev/null; then while read -r line do WORDS+=("$line") done < <(tmux list-sessions | cut -f1 -d:) COMPREPLY=($(compgen -W "${WORDS[*]}" -- "$CURWORD")) else echo "No tmux sessions" fi } complete -F _tmx_completions tmx ``` `x11.stuff` ```bash x11() { local D="$1" if [ "$D" = "-x" ]; then unset DISPLAY elif [ -n "$D" ]; then export DISPLAY="$D":0 else if [ -n "SSH_CLIENT" ]; then echo "Getting IP from SSH_CLIENT" IP="${SSH_CLIENT%% *}" echo " IP=$IP" export DISPLAY="$IP:0" else echo "x11 # to set display" echo "x11 -x # to unset display" fi fi } x11s() { local D="$1" if [ -n "SSH_CLIENT" ]; then echo "Getting IP from SSH_CLIENT" IP="${SSH_CLIENT%% *}" echo " IP=$IP" export DISPLAY="$IP:$D" else echo "x11 # to set display" echo "x11 -x # to unset display" fi } x11d() { local D="$1" if [[ $D =~ : ]]; then echo colon else echo no colon fi } ```