#exec 2>/a/tmp/bashlog
-# The default of sourcing this file for all ssh commands is a buggy practice. Normally, this
-# file is not sourced when a script is run, and we should follow that convention.
-# we can override with ssh -t which sets $SSH_TTY, which we can detect
+# By default this file is sourced for all ssh commands. This is wonky.
+# Normally, this file is not sourced when a script is run, and it would be much
+# better and more consistent if that also happened when when running a script
+# over ssh. so here we test for conditions of a script under ssh and return if
+# so. we can override with ssh -t which sets $SSH_TTY, which we can detect
+# But inside a script, ssh -t won't work, because we aren't using a tty at all.
+# So we need something else. Command lines and env variables sent across ssh are strictly limited.
+# We could override an obscure unused LC_var, like telephone, or we could transfer a file.
+# But I choose to set SendEnv and AcceptEnv ssh vars for BASH_LOGIN_SHELL.
+# In a private file, i have aliases for if $- == *i*, ssh -t, else ssh.
+
+[[ $- != *i* && ! $SSH_CONNECTION ]] && export BASH_LOGIN_SHELL=true
+
if [[ $SSH_CONNECTION ]] \
&& [[ $- == *c* ]] \
&& [[ ! $SSH_TTY ]] \
+ && [[ ! $BASH_LOGIN_SHELL == true ]] \
&& [[ $- != *i* ]]; then
return
fi
-# Side note on ssh. Command lines and env variables sent across ssh are strictly limited.
-# If we did want to easily pass info, we could override an obscure unused LC_var
-# Or we could set SendEnv and AcceptEnv ssh vars, or we could transfer a file.
+# Side note on ssh.
source "$x"
done
-# so I can share my bashrc
-source $HOME/bin/bash_private
+source $HOME/bin/semi-private # so I can share my bashrc
source $HOME/path_add-function
CDPATH=.:/a
+# remove gnome keyring warning messages
+# there is probably a more proper way, but I didn't find any easily on google
+unset GNOME_KEYRING_CONTROL
+
path_add /a/opt/adt-bundle*/tools /a/opt/adt-bundle*/platform-tools
#use extra globing features. See man bash, search extglob.
# advanced completion
# http://bash-completion.alioth.debian.org/
-# i was using the git version for a while. not bothering now.
-# seems a bit inefficient to source it here, and let the system bash
-# scripts source it too. todo, investigate if I am super bored sometime
-if [[ -r "/usr/share/bash-completion/bash_completion" ]]; then
+# i was using the git version for a while for a bug fix.
+# it's made it into distros now
+# usually this is sourced by the system already,
+# but I check just incase
+if ! type _init_completion &> /dev/null && [[ -r "/usr/share/bash-completion/bash_completion" ]]; then
. /usr/share/bash-completion/bash_completion
fi
# attempt to save multiline single commands as single history entries.
shopt -s cmdhist
+# inside emacs fixes
+if [[ $INSIDE_EMACS ]]; then
+ export INSIDE_EMACS
+ export PAGER=cat
+ export MANPAGER=cat
+ # for readline-complete.el
+ stty echo
+fi
+
+
if [[ $- == *i* ]]; then
# for readline-complete.el
if [[ $INSIDE_EMACS ]]; then
bind 'set horizontal-scroll-mode on'
bind 'set print-completions-horizontally on'
- stty echo
+ bind '"\C-i": self-insert'
else
- stty werase undef lnext undef stop undef start undef
- # terminal keys: C-c, C-z. the rest defined by stty -a are, at least in
- # gnome-terminal, overridden by bash, or disabled by the system
-
# arrow keys. for other terminals, see http://unix.stackexchange.com/questions/10806/how-to-change-previous-next-word-shortcut-in-bash
if [[ $TERM == "xterm" ]]; then
bind '"\e[1;5C": shell-forward-word' 2>/dev/null
bind '"\eOc": shell-forward-word'
bind '"\eOd": shell-backward-word'
fi
+ # terminal keys: C-c, C-z. the rest defined by stty -a are, at least in
+ # gnome-terminal, overridden by bash, or disabled by the system
+ stty werase undef lnext undef stop undef start undef
+
fi
fi
# history number. History expansion is good.
PS4='$LINENO+ '
# history file size limit, set to unlimited.
+# this needs to be different from the default because
+# default HISTFILESIZE is 500 and could clobber our history
HISTFILESIZE=
-# max commands 1 session can append to history
+# max commands 1 session can append/read from history
HISTSIZE=100000
-# this needs to be different from the derault because
-# default HISTFILESIZE is 500 and could clobber our history
+# my own history size limit based on lines
+HISTFILELINES=1000000
HISTFILE=$HOME/.bh
+# the time format display when doing the history command
+# also, setting this makes the history file record time
+# of each command as seconds from the epoch
HISTTIMEFORMAT="%I:%M %p %m/%d "
-# duplicate, single letter, and space prepended commands do not go in history
-HISTIGNORE="&:?: *"
+# consecutive duplicate lines don't go in history
+HISTCONTROL=ignoredups
+# just defensively unsetting this
+# this var can replace HISTCONTROL to do more flexible things like
+# not saving single char history items or specific names
+unset HISTIGNORE
export BC_LINE_LENGTH=0
# note, if I use a machine I don't want files readable by all users, set
# umask 077 # If fewer than 4 digits are entered, leading zeros are assumed
-
+C_DEFAULT_DIR=/a
}
-grp() {
- command grep --binary-files=without-match --color=auto "$@"
-}
+if type ack-grep >/dev/null 2>&1; then
+ alias ack=ack-grep
+fi
+
gr() {
- grep -i -r "$@"
+ grep -i --binary-files=without-match --color=auto "$@"
}
-
-
-
+grr() {
+ grep -ri --binary-files=without-match --color=auto "$@"
+}
calc() { echo "scale=3; $*" | bc -l; }
-cd() {
- if [[ $1 == .. ]]; then
- echo 'be cool, use the alias ".." instead :)'
- fi
- builtin cd "$@"
-}
-
# makes it so chown -R symlink affects the symlink and its target.
chown() {
}
# force symbolic link creation.
-# trash-put any existing targets,
-# then send all arguments to ln -s
+# trash-put any existing files where links would be created.
+# mkdir -p the directory containing the link(s) if needed.
+# then do ln -s -- "$@"
lnf() {
+ if [[ $# -gt 2 && ! -d ${!#} ]]; then
+ mkdir -p "${!#}"
+ fi
if [[ $# -gt 1 && -d ${!#} ]]; then
local oldcwd=$PWD
cd ${!#} # last arg
for x in "${@:1:$(($#-1))}"; do # all but last arg
- # a broken symlink will fail the "exists" -e test
- [[ -e "${x##*/}" || -L "${x##*/}" ]] && trash-put "${x##*/}"
+ # remove any trailing slashes
+ x="${x%%+(/)}"
+ # remove any leading directory components
+ x="${x##*/}"
+ te "$x" && trash-put "$x"
done
cd "$oldcwd"
elif [[ $# -eq 2 ]]; then
- [[ -e "$2" || -L "$2" ]] && rm "$2"
+ if te "$2"; then
+ trash-put "$2"
+ elif [[ ! -d $(getdir "$2") ]]; then
+ mkdir -p $(getdir "$2")
+ fi
else
- [[ -e "${1##*/}" || -L "${1##*/}" ]] && rm "${1##*/}"
+ te "${1##*/}" && rm "${1##*/}"
fi
- ln -s "$@"
+ ln -s -- "$@"
}
fi
}
pf() {
+ # scratch a very annoying itch.
+ # package description width as wide as the screen, and package name field small
+ # aptitude manual can't figure out how wide emacs terminal is,
+ # of course it doesn't consult the $COLUMNS variable...
+ # and in a normal terminal, it makes the package name field ridiculously big
+ # also, remove that useless dash before the description
if [[ $EUID == 0 ]]; then
- aptitude search "$@"
+ aptitude -F "%c%a%M %p %$((COLUMNS - 30))d" -w $COLUMNS search "$@"
else
- sudo aptitude search "$@"
+ sudo aptitude -F "%c%a%M %p %$((COLUMNS - 30))d" -w $COLUMNS search "$@"
fi
}
fi
-
+# test existence / exists
+te() {
+ local ret=0
+ for x in "$@"; do
+ [[ -e "$x" || -L "$x" ]] || ret=1
+ done
+ return $ret
+}
# fix root file ownership for FILE argument.
perm_fix() {
local parent
if [[ $EUID == 0 ]]; then
- [[ -e $1 ]] || touch $1
+ te "$1" || touch $1
if [[ $(stat -c "%u" "$1") == 0 ]] ; then
-
- argdir=$(dirstrip "$1")
+ argdir=$(getdir "$1")
if [[ $(stat -c "%u" "$argdir") != 0 ]] ; then
if ! chown "--reference=$argdir" "$1"; then
echo failed to fix bad ownership file permissons
find "${pathArray[@]}" -iname "*$1*"
}
-pstree() {
- ps -ejH "$@"
-}
-
-
pwd() { # do pwd + some other info.
echo "$(ll -d "$PWD") $USER@$HOSTNAME $(date +%r)"
-
hl() { # history limit. Write extra history to archive file.
- local max_lines linecount tempfile
- if ! [[ -w $HISTFILE ]] || ! [[ -w ${HISTFILE}_archive ]]; then
- echo "error: a history file is not writable."
- return 1
- fi
- history -w
- if [[ $1 ]]; then
- max_lines=$(($1 * 2)) # 2 lines for every history command
- else
- max_lines=1000000
- fi
- linecount=$(wc -l < $HISTFILE)
- linecount=${linecount:-0}
+ local max_lines linecount tempfile prune_lines
+ local harchive="${HISTFILE}_archive"
+ for x in "$HISTFILE" "$harchive"; do
+ if [[ ! $x || ! -w $x || $(stat -c "%u" "$x") != $EUID ]]; then
+ echo "error in hl: history file $x no good"
+ return 1
+ fi
+ done
+ history -a # save history
+ max_lines=$HISTFILELINES
+ [[ $max_lines =~ ^[0-9]+$ ]] || { echo "error in hl: failed to get max line count"; return 1; }
+ linecount=$(wc -l < $HISTFILE) # pipe so it doesn't output a filename
+ [[ $linecount =~ ^[0-9]+$ ]] || { echo "error in hl: wc failed"; return 1; }
if (($linecount > $max_lines)); then
prune_lines=$(($linecount - $max_lines))
- tempfile=$(mktemp)
- [[ $tempfile ]] || { echo mktemp failed; return 1; }
- head -$prune_lines $HISTFILE >> ${HISTFILE}a \
- && sed -e "1,${prune_lines}d" $HISTFILE > $tempfile \
- && mv $tempfile $HISTFILE
+ head -n $prune_lines "$HISTFILE" >> "$harchive" \
+ && sed -ie "1,${prune_lines}d" $HISTFILE
fi
- perm_fix $HISTFILE
- perm_fix ${HISTFILE}_archive
- history -c
- history -r
- history
}
-# run hl when bash exits normally
-trap hl EXIT
+# commands to run when bash exits normally
+trap "hl; smh" EXIT
# temporary variables to test colorization