# This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # LC_ALL=C LANG=C trap 'rm $TMPDIR/newhistory' 0 file=bax histchars='!^#' # make sure history comment char is set correctly unset HISTFILESIZE HISTTIMEFORMAT 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=$TMPDIR/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_comment_char echo ok 3 # !1200 # bash versions through bash-4.3 fail this; they make the digit preceding the # > into a separate word, changing the meaning of the redirection shopt a b c d 2>/dev/null echo !shopt-1 echo !shopt* # make sure a :p modifier anywhere on the line affects all history expansions echo one two three four echo !:2:p ; echo !$ echo one two three four echo !$ ; echo !:2:p ${THIS_SH} ./histexp1.sub ${THIS_SH} ./histexp2.sub ${THIS_SH} ./histexp3.sub ${THIS_SH} ./histexp4.sub ${THIS_SH} ./histexp5.sub ${THIS_SH} ./histexp6.sub ${THIS_SH} ./histexp7.sub