Blob Blame History Raw
LC_ALL=C
LANG=C
trap 'rm /tmp/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=/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_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