From: Ian Kelling Date: Tue, 13 May 2014 04:15:03 +0000 (-0700) Subject: history more reliable. change debconf solution X-Git-Url: https://iankelling.org/git/?p=distro-setup;a=commitdiff_plain;h=43aafd131d621f4d7c712d601b07ade1d2451f70 history more reliable. change debconf solution --- diff --git a/.bashrc b/.bashrc index e8651b5..ae0da0a 100644 --- a/.bashrc +++ b/.bashrc @@ -5,9 +5,11 @@ #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 ]] \ @@ -29,7 +31,7 @@ for x in $HOME/bin/bash-programs-by-ian/repos/*/*-function; do 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 @@ -62,10 +64,11 @@ shopt -s no_empty_cmd_completion # 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 @@ -78,27 +81,27 @@ shopt -s checkwinsize # 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 @@ -115,17 +118,24 @@ 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 -# 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 @@ -227,17 +237,8 @@ grr() { - - 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() { @@ -505,7 +506,7 @@ else fi -# test existence +# test existence / exists te() { local ret=0 for x in "$@"; do @@ -521,9 +522,8 @@ te() { 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 @@ -718,29 +718,23 @@ complete -F _longopt la lower low rlt rld rl lld ts ll dircp ex fcp fct fpst gr 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