LC_ALL=C LANG=C trap 'rm /tmp/newhistory' 0 file=bax histchars='!^#' # make sure history comment char is set correctly unset HISTFILESIZE history -c HISTFILE=history.list HISTCONTROL=ignoreboth HISTIGNORE='&:#*:history*:fc*' # we will end up exercising the history stifling code as a result HISTSIZE=32 shopt -s cmdhist set -o history history -p '!!' # this should result in a failed history expansion error history -p '!!:z' history HISTFILE=/tmp/newhistory history -a history -w history -s "echo line 2 for history" history history -p '!e' history -p '!!' set -H !! !e history echo a b c d e !?ch? !-2 ^2^8 !2 # we're selecting /bin/sh -c ...; we want `sh' echo !-1:0:t # we're selecting /bin/sh -c ...; we want `/bin' echo !-2:0:h # we're selecting `echo a b c d e'; we want `e' echo !?d?:5 echo a b c d e echo !-1:2-$ echo !-2:2-4 echo !-2:3* echo !!:* echo !?a?:2- echo file.c echo !!:$:r echo !-2:$:e echo !-3:$:r:q echo $file.c echo !!:$:r echo !-2:^:e echo !-3:$:r:q echo a b c d e echo !!:1-$:x echo !-2:1-$:q echo foo.c foo.o foo.html foo.h !!:s/foo/bar/ !-2:gs/foo/bar/ !!:gs/bar/x&/ !-2:g& # make sure we can use any delimiter in the substitution, not just `/' !!:gs+bar+whix+ !!:p # wow echo !?.o?:%:r:q !!:0 !?.h?:%:q !!:-$ !:-$ history # make sure single quotes inhibit history expansion echo '!!' # make sure backslashes can quote the history expansion character echo \!\! # but other expansions on the line should still be processed echo '!!' !!:* history -c unset HISTFILE # make sure that the special bash cases are not history expanded case p in [!A-Z]) echo ok 1;; esac var1='ok 2' var2=var1 echo ${!var2} # Bash-2.01[.1] fails this test -- it attempts history expansion after the # history_expansion_char echo ok 3 # !1200