1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-02-13 19:52:20 +00:00

Make the 'history' and 'r' commands builtins (#76)

With this change no more preset aliases exist, so the preset alias
tables can be safely removed. All ksh commands can now be used
without 'unalias -a' removing them, even in interactive shells.
Additionally, the history and r commands are no longer limited to
being used in interactive shells.

src/cmd/ksh93/bltins/hist.c:
- Implement the history and r commands as builtins. Also guarantee
  lflag is set to one by avoiding 'lflag++'.

src/cmd/ksh93/Makefile,
src/cmd/ksh93/Mamfile,
src/cmd/ksh93/sh/main.c,
src/cmd/ksh93/sh/init.c,
src/cmd/ksh93/data/aliases.c:
- Remove the table of predefined aliases because the last few have
  been removed. During init the alias tree is now initialized the
  same way as the function tree.

src/cmd/ksh93/bltins/typeset.c:
- Remove the bugfix for unsetting predefined aliases because it is
  now a no-op. Aliases are no longer able to have the NV_NOFREE
  attribute.

src/cmd/ksh93/tests/alias.sh:
- Remove the regression test for unsetting predefined aliases since
  those no longer exist.

src/cmd/ksh93/data/builtins.c:
- Update sh_opthist[] for 'hist --man', etc.

src/cmd/ksh93/sh.1:
- Remove the list of preset aliases since those no longer exist.
- Document history and r as builtins instead of preset aliases.

Co-authored-by: Martijn Dekker <martijn@inlv.org>
This commit is contained in:
Johnothan King 2020-07-16 10:56:49 -07:00 committed by GitHub
parent 17f81ebedb
commit 03224ae3af
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 47 additions and 100 deletions

8
NEWS
View file

@ -3,6 +3,11 @@ For full details, see the git log at: https://github.com/ksh93/ksh
Any uppercase BUG_* names are modernish shell bug IDs. Any uppercase BUG_* names are modernish shell bug IDs.
2020-07-16:
- The 'history' and 'r' default aliases have been made regular built-ins,
leaving zero default aliases.
2020-07-15: 2020-07-15:
- The 'autoload', 'compound', 'float', 'functions', 'integer' and 'nameref' - The 'autoload', 'compound', 'float', 'functions', 'integer' and 'nameref'
@ -10,9 +15,6 @@ Any uppercase BUG_* names are modernish shell bug IDs.
that 'unalias -a' does not remove them. Shell functions can now use that 'unalias -a' does not remove them. Shell functions can now use
these names, which improves compatibility with POSIX shell scripts. these names, which improves compatibility with POSIX shell scripts.
- The two default aliases that are left, 'history' and 'r', are now only
loaded on interactive shells, leaving zero default aliases for scripts.
- The End key escape sequence '^[[F' is now handled in the emacs and vi editing - The End key escape sequence '^[[F' is now handled in the emacs and vi editing
modes. The End key moves the cursor to the end of the line (in contrast to modes. The End key moves the cursor to the end of the line (in contrast to
the Home key doing the opposite). the Home key doing the opposite).

View file

@ -156,7 +156,7 @@ end
$(SH) :: sh.1 pmain.c $(LIBS_req) $(SH) :: sh.1 pmain.c $(LIBS_req)
DATAFILES = limits.c msg.c strdata.c testops.c keywords.c options.c \ DATAFILES = limits.c msg.c strdata.c testops.c keywords.c options.c \
signals.c aliases.c builtins.c variables.c lexstates.c signals.c builtins.c variables.c lexstates.c
shell$(RELEASE) $(VERSION) id=shell :LIBRARY: shell.3 nval.3 alarm.c cd_pwd.c cflow.c deparse.c \ shell$(RELEASE) $(VERSION) id=shell :LIBRARY: shell.3 nval.3 alarm.c cd_pwd.c cflow.c deparse.c \
enum.c getopts.c hist.c misc.c print.c read.c sleep.c trap.c test.c \ enum.c getopts.c hist.c misc.c print.c read.c sleep.c trap.c test.c \

View file

@ -1238,16 +1238,6 @@ meta signals.o %.c>%.o data/signals.c signals
prev data/signals.c prev data/signals.c
exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} -DSHOPT_STATS -DSHOPT_NAMESPACE -DSHOPT_COSHELL -DSHOPT_PFSH -DSHOPT_HISTEXPAND -D_BLD_shell -D_API_ast=20100309 -D_PACKAGE_ast -DERROR_CONTEXT_T=Error_context_t -DSHOPT_FIXEDARRAY -DSHOPT_ESH -DSHOPT_MULTIBYTE -c data/signals.c exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} -DSHOPT_STATS -DSHOPT_NAMESPACE -DSHOPT_COSHELL -DSHOPT_PFSH -DSHOPT_HISTEXPAND -D_BLD_shell -D_API_ast=20100309 -D_PACKAGE_ast -DERROR_CONTEXT_T=Error_context_t -DSHOPT_FIXEDARRAY -DSHOPT_ESH -DSHOPT_MULTIBYTE -c data/signals.c
done signals.o generated done signals.o generated
make aliases.o
make data/aliases.c
prev FEATURE/dynamic implicit
prev FEATURE/options implicit
prev include/defs.h implicit
done data/aliases.c
meta aliases.o %.c>%.o data/aliases.c aliases
prev data/aliases.c
exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} -DSHOPT_DYNAMIC -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_STATS -DSHOPT_NAMESPACE -DSHOPT_COSHELL -DSHOPT_HISTEXPAND -D_BLD_shell -D_API_ast=20100309 -DERROR_CONTEXT_T=Error_context_t -DSHOPT_FIXEDARRAY -DSHOPT_ESH -c data/aliases.c
done aliases.o generated
make builtins.o make builtins.o
make data/builtins.c make data/builtins.c
prev FEATURE/cmds implicit prev FEATURE/cmds implicit
@ -1329,7 +1319,7 @@ prev edit/hexpand.c
exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} -DSHOPT_HISTEXPAND -DSHOPT_EDPREDICT -DSHOPT_MULTIBYTE -DKSHELL -DSHOPT_ESH -DSHOPT_VSH -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_STATS -DSHOPT_NAMESPACE -DSHOPT_COSHELL -D_BLD_shell -D_API_ast=20100309 -DERROR_CONTEXT_T=Error_context_t -DSHOPT_FIXEDARRAY -c edit/hexpand.c exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} -DSHOPT_HISTEXPAND -DSHOPT_EDPREDICT -DSHOPT_MULTIBYTE -DKSHELL -DSHOPT_ESH -DSHOPT_VSH -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_STATS -DSHOPT_NAMESPACE -DSHOPT_COSHELL -D_BLD_shell -D_API_ast=20100309 -DERROR_CONTEXT_T=Error_context_t -DSHOPT_FIXEDARRAY -c edit/hexpand.c
done hexpand.o generated done hexpand.o generated
exec - ${AR} rc libshell.a alarm.o cd_pwd.o cflow.o deparse.o enum.o getopts.o hist.o misc.o print.o read.o sleep.o trap.o test.o typeset.o ulimit.o umask.o whence.o main.o nvdisc.o nvtype.o arith.o args.o array.o completion.o defs.o edit.o expand.o regress.o fault.o fcin.o exec - ${AR} rc libshell.a alarm.o cd_pwd.o cflow.o deparse.o enum.o getopts.o hist.o misc.o print.o read.o sleep.o trap.o test.o typeset.o ulimit.o umask.o whence.o main.o nvdisc.o nvtype.o arith.o args.o array.o completion.o defs.o edit.o expand.o regress.o fault.o fcin.o
exec - ${AR} rc libshell.a history.o init.o io.o jobs.o lex.o macro.o name.o nvtree.o parse.o path.o string.o streval.o subshell.o tdump.o timers.o trestore.o waitevent.o xec.o env.o limits.o msg.o strdata.o testops.o keywords.o options.o signals.o aliases.o builtins.o variables.o lexstates.o emacs.o vi.o hexpand.o exec - ${AR} rc libshell.a history.o init.o io.o jobs.o lex.o macro.o name.o nvtree.o parse.o path.o string.o streval.o subshell.o tdump.o timers.o trestore.o waitevent.o xec.o env.o limits.o msg.o strdata.o testops.o keywords.o options.o signals.o builtins.o variables.o lexstates.o emacs.o vi.o hexpand.o
exec - (ranlib libshell.a) >/dev/null 2>&1 || true exec - (ranlib libshell.a) >/dev/null 2>&1 || true
done libshell.a generated done libshell.a generated
bind -lshell bind -lshell

View file

@ -58,6 +58,13 @@ int b_hist(int argc,char *argv[], Shbltin_t *context)
NOT_USED(argc); NOT_USED(argc);
if(!sh_histinit((void*)shp)) if(!sh_histinit((void*)shp))
errormsg(SH_DICT,ERROR_system(1),e_histopen); errormsg(SH_DICT,ERROR_system(1),e_histopen);
/* 'history' and 'r' builtins */
if(argv[0][0] == 'r') /* <r> */
edit = "-";
else if(argv[0][0] == 'h' && argv[0][4] == 'o') /* hist<o>ry (argv[0][4] is zero when called as 'hist') */
lflag = 1;
hp = shp->gd->hist_ptr; hp = shp->gd->hist_ptr;
while((flag = optget(argv,sh_opthist))) switch(flag) while((flag = optget(argv,sh_opthist))) switch(flag)
{ {
@ -68,7 +75,7 @@ int b_hist(int argc,char *argv[], Shbltin_t *context)
nflag++; nflag++;
break; break;
case 'l': case 'l':
lflag++; lflag = 1;
break; break;
case 'r': case 'r':
rflag++; rflag++;

View file

@ -1328,12 +1328,7 @@ static int unall(int argc, char **argv, register Dt_t *troot, Shell_t* shp)
} }
/* The alias has been unset by call to _nv_unset, remove it from the tree */ /* The alias has been unset by call to _nv_unset, remove it from the tree */
else if(troot==shp->alias_tree) else if(troot==shp->alias_tree)
{ nv_delete(np,troot,0);
if(nv_isattr(np, NV_NOFREE))
nv_delete(np,troot,NV_NOFREE); /* The alias is in read-only memory (shtab_aliases) */
else
nv_delete(np,troot,0);
}
#if 0 #if 0
/* causes unsetting local variable to expose global */ /* causes unsetting local variable to expose global */
else if(shp->var_tree==troot && shp->var_tree!=shp->var_base && nv_search((char*)np,shp->var_tree,HASH_BUCKET|HASH_NOSCOPE)) else if(shp->var_tree==troot && shp->var_tree!=shp->var_base && nv_search((char*)np,shp->var_tree,HASH_BUCKET|HASH_NOSCOPE))

View file

@ -1,45 +0,0 @@
/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 1982-2012 AT&T Intellectual Property *
* and is licensed under the *
* Eclipse Public License, Version 1.0 *
* by AT&T Intellectual Property *
* *
* A copy of the License is available at *
* http://www.eclipse.org/org/documents/epl-v10.html *
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
* *
* Information and Software Systems Research *
* AT&T Research *
* Florham Park NJ *
* *
* David Korn <dgk@research.att.com> *
* *
***********************************************************************/
#pragma prototyped
#include "defs.h"
#include <signal.h>
#include "FEATURE/options"
#include "FEATURE/dynamic"
/*
* Table of built-in aliases for interactive shells.
*/
const struct shtable2 shtab_aliases[] =
{
"history", NV_NOFREE, "hist -l",
"r", NV_NOFREE, "hist -s",
"", 0, (char*)0
};
/*
* Empty table of built-in aliases for non-interactive shells.
*/
const struct shtable2 shtab_noaliases[] =
{
"", 0, (char*)0
};

View file

@ -94,6 +94,8 @@ const struct shtable3 shtab_builtins[] =
"exit", NV_BLTIN|BLT_ENV|BLT_SPC, bltin(return), "exit", NV_BLTIN|BLT_ENV|BLT_SPC, bltin(return),
"fc", NV_BLTIN|BLT_ENV|BLT_EXIT, bltin(hist), "fc", NV_BLTIN|BLT_ENV|BLT_EXIT, bltin(hist),
"hist", NV_BLTIN|BLT_ENV|BLT_EXIT, bltin(hist), "hist", NV_BLTIN|BLT_ENV|BLT_EXIT, bltin(hist),
"history", NV_BLTIN|BLT_ENV|BLT_EXIT, bltin(hist),
"r", NV_BLTIN|BLT_ENV|BLT_EXIT, bltin(hist),
"readonly", NV_BLTIN|BLT_ENV|BLT_SPC|BLT_DCL,bltin(readonly), "readonly", NV_BLTIN|BLT_ENV|BLT_SPC|BLT_DCL,bltin(readonly),
"shift", NV_BLTIN|BLT_ENV|BLT_SPC, bltin(shift), "shift", NV_BLTIN|BLT_ENV|BLT_SPC, bltin(shift),
"trap", NV_BLTIN|BLT_ENV|BLT_SPC, bltin(trap), "trap", NV_BLTIN|BLT_ENV|BLT_SPC, bltin(trap),
@ -953,11 +955,15 @@ const char sh_opthash[] =
; ;
const char sh_opthist[] = const char sh_opthist[] =
"[-1cn?@(#)$Id: hist (AT&T Research) 2000-04-02 $\n]" "[-1cn?@(#)$Id: hist (AT&T Research/ksh93) 2020-07-16 $\n]"
USAGE_LICENSE USAGE_LICENSE
"[+NAME?\f?\f - process command history list]" "[+NAME?fc, hist, history, r - process command history list]"
"[+DESCRIPTION?\b\f?\f\b lists, edits, or re-executes, commands " "[+DESCRIPTION?\bhist\b lists, edits, or re-executes commands "
"previously entered into the current shell environment.]" "previously entered into the current shell environment.]"
"[+?The following command equivalents exist: "
"\bfc\b is \bhist\b; "
"\bhistory\b is \bhist -l\b (list history); "
"and \br\b is \bhist -s\b (reexecute command).]"
"[+?The command history list references commands by number. The first number " "[+?The command history list references commands by number. The first number "
"in the list is selected arbitrarily. The relationship of a number " "in the list is selected arbitrarily. The relationship of a number "
"to its command does not change during a login session. When the " "to its command does not change during a login session. When the "
@ -965,11 +971,11 @@ USAGE_LICENSE
"maintains the ordering.]" "maintains the ordering.]"
"[+?When commands are edited (when the \b-l\b option is not specified), the " "[+?When commands are edited (when the \b-l\b option is not specified), the "
"resulting lines will be entered at the end of the history list and " "resulting lines will be entered at the end of the history list and "
"then reexecuted by the current shell. The \b\f?\f\b command that " "then reexecuted by the current shell. The \bhist\b command that "
"caused the editing will not be entered into the history list. If the " "caused the editing will not be entered into the history list. If the "
"editor returns a non-zero exit status, this will suppress the " "editor returns a non-zero exit status, this will suppress the "
"entry into the history list and the command reexecution. Command " "entry into the history list and the command reexecution. Command "
"line variable assignments and redirections affect both the \f?\f " "line variable assignments and redirections affect both the \bhist\b "
"command and the commands that are reexecuted.]" "command and the commands that are reexecuted.]"
"[+?\afirst\a and \alast\a define the range of commands. \afirst\a and " "[+?\afirst\a and \alast\a define the range of commands. \afirst\a and "
"\alast\a can be one of the following:]{" "\alast\a can be one of the following:]{"

View file

@ -55,13 +55,10 @@ extern const Shtable_t shtab_testops[];
extern const Shtable_t shtab_options[]; extern const Shtable_t shtab_options[];
extern const Shtable_t shtab_attributes[]; extern const Shtable_t shtab_attributes[];
extern const struct shtable2 shtab_variables[]; extern const struct shtable2 shtab_variables[];
extern const struct shtable2 shtab_aliases[];
extern const struct shtable2 shtab_noaliases[];
extern const struct shtable2 shtab_signals[]; extern const struct shtable2 shtab_signals[];
extern const struct shtable3 shtab_builtins[]; extern const struct shtable3 shtab_builtins[];
extern const Shtable_t shtab_reserved[]; extern const Shtable_t shtab_reserved[];
extern const Shtable_t *sh_locate(const char*, const Shtable_t*, int); extern const Shtable_t *sh_locate(const char*, const Shtable_t*, int);
extern int sh_lookopt(const char*, int*); extern int sh_lookopt(const char*, int*);
extern Dt_t *sh_inittree(Shell_t*, const struct shtable2*);
#endif /* SH_TABLE_H */ #endif /* SH_TABLE_H */

View file

@ -17,4 +17,4 @@
* David Korn <dgk@research.att.com> * * David Korn <dgk@research.att.com> *
* * * *
***********************************************************************/ ***********************************************************************/
#define SH_RELEASE "93u+m 2020-07-15" #define SH_RELEASE "93u+m 2020-07-16"

View file

@ -777,20 +777,9 @@ not while they are executed.
Therefore, Therefore,
for an alias to take effect, for an alias to take effect,
the the
.B .B alias
alias
definition command has to be executed before definition command has to be executed before
the command which references the alias is read. the command which references the alias is read.
.PP
The following aliases
are compiled into the shell
but can be unset or redefined:
.RS 20
.PD 0
.TP
.B "history=\(fmhist \-l\(fm"
.TP
.B "r=\(fmhist \-s\(fm"
.PD .PD
.RE .RE
.SS Tilde Substitution. .SS Tilde Substitution.
@ -4367,9 +4356,9 @@ to re-execute the command.
In this case a substitution parameter of the form In this case a substitution parameter of the form
\f2old\fP\f3=\fP\f2new\fP \f2old\fP\f3=\fP\f2new\fP
can be used to modify the command before execution. can be used to modify the command before execution.
For example, with the preset alias For example, with the builtin
.BR r , .BR r ,
which is aliased to which is functionally equivalent to
.BR "\(fmhist \-s\(fm" , .BR "\(fmhist \-s\(fm" ,
typing typing
`\f3r bad=good c\fP' `\f3r bad=good c\fP'
@ -6211,6 +6200,11 @@ after the optional substitution
\f2old\^\fP\f3=\fP\f2new\^\fP \f2old\^\fP\f3=\fP\f2new\^\fP
is performed. is performed.
.TP .TP
\f3history\fP \*(OK \f3\-nr\^\fP \*(CK \*(OK \f2first\^\fP \*(OK \f2last\^\fP \*(CK \*(CK
Lists commands in the history file.
The same as
.BR hist\ \-l .
.TP
\(dd \f3integer\fP \f2vname\fP\*(OK\f3=\fP\f2value\^\fP\*(CK .\|.\|. \(dd \f3integer\fP \f2vname\fP\*(OK\f3=\fP\f2value\^\fP\*(CK .\|.\|.
Declares each \f2vname\fP to be a long integer number. Declares each \f2vname\fP to be a long integer number.
The same as The same as
@ -6624,6 +6618,11 @@ or
on the command line on the command line
determines which method is used. determines which method is used.
.TP .TP
\f3r\fP \*(OK \f2old\fP\f3\=\fP\f2new\^\fP \*(CK \*(OK \f2command\^\fP \*(CK
Reexecutes a command in the history file.
The same as
.BR hist\ \-s .
.TP
\f3read\fP \*(OK \f3\-ACSprsv\^\fP \*(CK \*(OK \f3\-d\fP \f2delim \^\fP\*(CK \*(OK \f3\-n\fP \f2n \^\fP\*(CK \*(OK \*(OK \f3\-N\fP \f2n \^\fP\*(CK \*(OK \f3\-t\fP \f2timeout \^\fP\*(CK \*(OK \f3\-u\fP \f2unit \^\fP\*(CK \*(OK \f2vname\f3?\f2prompt\^\f1 \*(CK \*(OK \f2vname\^\fP .\|.\|. \*(CK \f3read\fP \*(OK \f3\-ACSprsv\^\fP \*(CK \*(OK \f3\-d\fP \f2delim \^\fP\*(CK \*(OK \f3\-n\fP \f2n \^\fP\*(CK \*(OK \*(OK \f3\-N\fP \f2n \^\fP\*(CK \*(OK \f3\-t\fP \f2timeout \^\fP\*(CK \*(OK \f3\-u\fP \f2unit \^\fP\*(CK \*(OK \f2vname\f3?\f2prompt\^\f1 \*(CK \*(OK \f2vname\^\fP .\|.\|. \*(CK
The shell input mechanism. The shell input mechanism.
One line is read and One line is read and

View file

@ -217,6 +217,7 @@ static int lctype;
static int nbltins; static int nbltins;
static void env_init(Shell_t*); static void env_init(Shell_t*);
static Init_t *nv_init(Shell_t*); static Init_t *nv_init(Shell_t*);
static Dt_t *inittree(Shell_t*,const struct shtable2*);
static int shlvl; static int shlvl;
#ifdef _WINIX #ifdef _WINIX
@ -1560,7 +1561,7 @@ int sh_reinit(char *argv[])
nv_delete(np,dp,NV_NOFREE); nv_delete(np,dp,NV_NOFREE);
} }
dtclose(shp->alias_tree); dtclose(shp->alias_tree);
shp->alias_tree = sh_inittree(shp,shtab_noaliases); shp->alias_tree = dtopen(&_Nvdisc,Dtoset);
shp->last_root = shp->var_tree; shp->last_root = shp->var_tree;
shp->inuse_bits = 0; shp->inuse_bits = 0;
if(shp->userinit) if(shp->userinit)
@ -1759,7 +1760,7 @@ static Init_t *nv_init(Shell_t *shp)
shp->nvfun.last = (char*)shp; shp->nvfun.last = (char*)shp;
shp->nvfun.nofree = 1; shp->nvfun.nofree = 1;
ip->sh = shp; ip->sh = shp;
shp->var_base = shp->var_tree = sh_inittree(shp,shtab_variables); shp->var_base = shp->var_tree = inittree(shp,shtab_variables);
SHLVL->nvalue.ip = &shlvl; SHLVL->nvalue.ip = &shlvl;
ip->IFS_init.hdr.disc = &IFS_disc; ip->IFS_init.hdr.disc = &IFS_disc;
ip->PATH_init.disc = &RESTRICTED_disc; ip->PATH_init.disc = &RESTRICTED_disc;
@ -1852,9 +1853,9 @@ static Init_t *nv_init(Shell_t *shp)
(MCHKNOD)->nvalue.lp = (&sh_mailchk); (MCHKNOD)->nvalue.lp = (&sh_mailchk);
(OPTINDNOD)->nvalue.lp = (&shp->st.optindex); (OPTINDNOD)->nvalue.lp = (&shp->st.optindex);
/* set up the seconds clock */ /* set up the seconds clock */
shp->alias_tree = sh_inittree(shp,shtab_noaliases); shp->alias_tree = dtopen(&_Nvdisc,Dtoset);
shp->track_tree = dtopen(&_Nvdisc,Dtset); shp->track_tree = dtopen(&_Nvdisc,Dtset);
shp->bltin_tree = sh_inittree(shp,(const struct shtable2*)shtab_builtins); shp->bltin_tree = inittree(shp,(const struct shtable2*)shtab_builtins);
shp->fun_tree = dtopen(&_Nvdisc,Dtoset); shp->fun_tree = dtopen(&_Nvdisc,Dtoset);
dtview(shp->fun_tree,shp->bltin_tree); dtview(shp->fun_tree,shp->bltin_tree);
nv_mount(DOTSHNOD, "type", shp->typedict=dtopen(&_Nvdisc,Dtoset)); nv_mount(DOTSHNOD, "type", shp->typedict=dtopen(&_Nvdisc,Dtoset));
@ -1877,7 +1878,7 @@ static Init_t *nv_init(Shell_t *shp)
* initialize name-value pairs * initialize name-value pairs
*/ */
Dt_t *sh_inittree(Shell_t *shp,const struct shtable2 *name_vals) static Dt_t *inittree(Shell_t *shp,const struct shtable2 *name_vals)
{ {
register Namval_t *np; register Namval_t *np;
register const struct shtable2 *tp; register const struct shtable2 *tp;

View file

@ -176,8 +176,6 @@ int sh_main(int ac, char *av[], Shinit_f userinit)
{ {
sh_onoption(SH_BGNICE); sh_onoption(SH_BGNICE);
sh_onoption(SH_RC); sh_onoption(SH_RC);
free(shp->alias_tree);
shp->alias_tree = sh_inittree(shp,shtab_aliases);
} }
if(!sh_isoption(SH_RC) && (sh_isoption(SH_BASH) && !sh_isoption(SH_POSIX) if(!sh_isoption(SH_RC) && (sh_isoption(SH_BASH) && !sh_isoption(SH_POSIX)
#if SHOPT_REMOTE #if SHOPT_REMOTE

View file

@ -109,8 +109,5 @@ alias foo=bar
unalias foo unalias foo
unalias foo && err_exit 'unalias should return non-zero when a previously set alias is unaliased twice' unalias foo && err_exit 'unalias should return non-zero when a previously set alias is unaliased twice'
# Removing a predefined alias should work without an error from free(3)
$SHELL -i -c 'unalias history' 2> /dev/null || err_exit 'removing a predefined alias does not work'
# ====== # ======
exit $((Errors<125?Errors:125)) exit $((Errors<125?Errors:125))