mirror of
				git://git.code.sf.net/p/cdesktopenv/code
				synced 2025-03-09 15:50:02 +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…
	
	Add table
		Add a link
		
	
		Reference in a new issue