| # 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 <http://www.gnu.org/licenses/>. |
| # |
| 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 |