#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
if [[ $SSH_CONNECTION ]] \
&& [[ $- == *c* ]] \
&& [[ ! $SSH_TTY ]] \
source "$x"
done
-source $HOME/bin/bash_private # so I can share my bashrc
+source $HOME/bin/semi-private # so I can share my bashrc
source $HOME/path_add-function
# 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
+else
+ # 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
+
+
if [[ $- == *i* ]]; then
# for readline-complete.el
if [[ $INSIDE_EMACS ]]; then
bind 'set horizontal-scroll-mode on'
bind 'set print-completions-horizontally on'
- export PAGER=cat
- export MANPAGER=cat
- stty echo
- # debconf occasionally spews messages about wanting to initialize dialog
- # and falling back to readline, since our terminal is dumb, then does nothing,
- # This is a long standing bug. Here is the fix.
- if [[ $DISPLAY ]]; then
- export DEBIAN_FRONTEND=gnome
- else
- export DEBIAN_FRONTEND=readline
- fi
+ 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
# 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
-# my history size limit based on lines
+# my own history size limit based on lines
HISTFILELINES=1000000
-# this needs to be different from the derault because
-# default HISTFILESIZE is 500 and could clobber our history
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 "
# consecutive duplicate lines don't go in history
-HISTIGNORE="&"
+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
-
-
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() {
fi
-# test existence
+# test existence / exists
te() {
local ret=0
for x in "$@"; do
perm_fix() {
local parent
if [[ $EUID == 0 ]]; then
- [[ -e $1 ]] || touch $1
+ te "$1" || touch $1
if [[ $(stat -c "%u" "$1") == 0 ]] ; then
-
argdir=$(getdir "$1")
if [[ $(stat -c "%u" "$argdir") != 0 ]] ; then
if ! chown "--reference=$argdir" "$1"; then
hl() { # history limit. Write extra history to archive file.
local max_lines linecount tempfile
- for x in $HISTFILE ${HISTFILE}_archive; do
- if [[ -e $x && ! -w $x ]]; then
- echo "error: history file $x is not writable."
+ 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 -w
- if [[ $1 ]]; then
- max_lines=$(($1 * 2)) # 2 lines for every history command
- else
- max_lines=$HISTFILELINES
- fi
- linecount=$(wc -l < $HISTFILE)
- linecount=${linecount:-0}
+ max_lines=$HISTFILELINES
+ [[ $max_lines ]] || { 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 \
+ head -n $prune_lines "$HISTFILE" >> "$harchive" \
&& sed -ie "1,${prune_lines}d" $HISTFILE
fi
- perm_fix $HISTFILE
- perm_fix ${HISTFILE}_archive
}
# commands to run when bash exits normally