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:
parent
17f81ebedb
commit
03224ae3af
13 changed files with 47 additions and 100 deletions
8
NEWS
8
NEWS
|
@ -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).
|
||||||
|
|
|
@ -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 \
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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++;
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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
|
|
||||||
};
|
|
||||||
|
|
|
@ -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:]{"
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Reference in a new issue