mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Convert default typeset aliases to regular builtins
This converts the 'autoload', 'compound', 'float', 'functions', 'integer' and 'nameref' default aliases into regular built-in commands, so that 'unalias -a' does not remove them. Shell functions can now use these names, which improves compatibility with POSIX shell scripts. src/cmd/ksh93/data/aliases.c: - Remove default typeset aliases. src/cmd/ksh93/data/builtins.c, src/cmd/ksh93/include/builtins.h: - Add corresponding built-in command declarations. Typeset-style commands are now defined by a pointer range, SYSTYPESET .. SYSTYPESET_END. A couple need their own IDs (SYSCOMPOUND, SYSNAMEREF) for special-casing in sh/xec.c. - Update 'typeset --man'. src/cmd/ksh93/bltins/typeset.c: b_typeset(): - Recognise the new builtin commands by argv[0]. Implement them by inserting the corresponding 'typeset' options into the argument list before parsing options. This may seem like a bit of a hack, but it is simpler, shorter, more future-proof and less error-prone than manually copying and adapting all the complex flaggery from the option parsing loop. src/cmd/ksh93/sh/parse.c, src/cmd/ksh93/sh/xec.c: - Recognise typeset-style commands by SYSTYPESET .. SYSTYPESET_END pointer range. - Special-case 'compound' (SYSCOMPOUND) and 'nameref' (SYSNAMEREF) along with recognising the corresponding 'typeset' options. src/cmd/ksh93/sh.1: - Update to document the new built-ins. - Since not all declaration commands are special built-ins now, identify declaration commands using a double-dagger "\(dd" character (which renders as '=' in ASCII) and disassociate their definition from that of special built-ins. src/cmd/ksh93/tests/variables.sh: - Adapt a regression test as there is no more 'integer' alias.
This commit is contained in:
parent
45cfecfc1e
commit
1fbbeaa19d
10 changed files with 129 additions and 65 deletions
7
NEWS
7
NEWS
|
@ -3,6 +3,13 @@ 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-15:
|
||||||
|
|
||||||
|
- The 'autoload', 'compound', 'float', 'functions', 'integer' and 'nameref'
|
||||||
|
default aliases have been converted into regular built-in commands, so
|
||||||
|
that 'unalias -a' does not remove them. Shell functions can now use
|
||||||
|
these names, which improves compatibility with POSIX shell scripts.
|
||||||
|
|
||||||
2020-07-14:
|
2020-07-14:
|
||||||
|
|
||||||
- Fixed a bug that caused 'set -b' to have no effect.
|
- Fixed a bug that caused 'set -b' to have no effect.
|
||||||
|
|
|
@ -210,16 +210,39 @@ int b_typeset(int argc,register char *argv[],Shbltin_t *context)
|
||||||
Namdecl_t *ntp = (Namdecl_t*)context->ptr;
|
Namdecl_t *ntp = (Namdecl_t*)context->ptr;
|
||||||
Dt_t *troot;
|
Dt_t *troot;
|
||||||
int isfloat=0, shortint=0, sflag=0;
|
int isfloat=0, shortint=0, sflag=0;
|
||||||
NOT_USED(argc);
|
char *new_argv[argc + 1];
|
||||||
|
|
||||||
memset((void*)&tdata,0,sizeof(tdata));
|
memset((void*)&tdata,0,sizeof(tdata));
|
||||||
tdata.sh = context->shp;
|
tdata.sh = context->shp;
|
||||||
if(ntp)
|
troot = tdata.sh->var_tree;
|
||||||
|
if(ntp) /* custom declaration command added using enum */
|
||||||
{
|
{
|
||||||
tdata.tp = ntp->tp;
|
tdata.tp = ntp->tp;
|
||||||
opt_info.disc = (Optdisc_t*)ntp->optinfof;
|
opt_info.disc = (Optdisc_t*)ntp->optinfof;
|
||||||
optstring = ntp->optstring;
|
optstring = ntp->optstring;
|
||||||
}
|
}
|
||||||
troot = tdata.sh->var_tree;
|
else if(argv[0][0] != 't') /* not <t>ypeset */
|
||||||
|
{
|
||||||
|
new_argv[0] = "typeset";
|
||||||
|
if(argv[0][0] == 'a') /* <a>utoload == typeset -fu */
|
||||||
|
new_argv[1] = "-fu";
|
||||||
|
else if(argv[0][0] == 'c') /* <c>ompound == typeset -C */
|
||||||
|
new_argv[1] = "-C";
|
||||||
|
else if(argv[0][1] == 'l') /* f<l>oat == typeset -lE */
|
||||||
|
new_argv[1] = "-lE";
|
||||||
|
else if(argv[0][1] == 'u') /* f<u>nctions == typeset -f */
|
||||||
|
new_argv[1] = "-f";
|
||||||
|
else if(argv[0][0] == 'i') /* <i>nteger == typeset -li */
|
||||||
|
new_argv[1] = "-li";
|
||||||
|
else if(argv[0][0] == 'n') /* <n>ameref == typeset -n */
|
||||||
|
new_argv[1] = "-n";
|
||||||
|
else
|
||||||
|
errormsg(SH_DICT, ERROR_exit(128), "internal error");
|
||||||
|
for (n = 1; n <= argc; n++)
|
||||||
|
new_argv[n + 1] = argv[n];
|
||||||
|
argc++;
|
||||||
|
argv = new_argv;
|
||||||
|
}
|
||||||
while((n = optget(argv,optstring)))
|
while((n = optget(argv,optstring)))
|
||||||
{
|
{
|
||||||
if(tdata.aflag==0)
|
if(tdata.aflag==0)
|
||||||
|
|
|
@ -29,13 +29,7 @@
|
||||||
|
|
||||||
const struct shtable2 shtab_aliases[] =
|
const struct shtable2 shtab_aliases[] =
|
||||||
{
|
{
|
||||||
"autoload", NV_NOFREE, "typeset -fu",
|
|
||||||
"compound", NV_NOFREE|BLT_DCL, "typeset -C",
|
|
||||||
"float", NV_NOFREE|BLT_DCL, "typeset -lE",
|
|
||||||
"functions", NV_NOFREE, "typeset -f",
|
|
||||||
"history", NV_NOFREE, "hist -l",
|
"history", NV_NOFREE, "hist -l",
|
||||||
"integer", NV_NOFREE|BLT_DCL, "typeset -li",
|
|
||||||
"nameref", NV_NOFREE|BLT_DCL, "typeset -n",
|
|
||||||
"r", NV_NOFREE, "hist -s",
|
"r", NV_NOFREE, "hist -s",
|
||||||
"", 0, (char*)0
|
"", 0, (char*)0
|
||||||
};
|
};
|
||||||
|
|
|
@ -68,6 +68,12 @@ const struct shtable3 shtab_builtins[] =
|
||||||
"break", NV_BLTIN|BLT_ENV|BLT_SPC, bltin(break),
|
"break", NV_BLTIN|BLT_ENV|BLT_SPC, bltin(break),
|
||||||
"continue", NV_BLTIN|BLT_ENV|BLT_SPC, bltin(break),
|
"continue", NV_BLTIN|BLT_ENV|BLT_SPC, bltin(break),
|
||||||
"typeset", NV_BLTIN|BLT_ENV|BLT_SPC|BLT_DCL,bltin(typeset),
|
"typeset", NV_BLTIN|BLT_ENV|BLT_SPC|BLT_DCL,bltin(typeset),
|
||||||
|
"autoload", NV_BLTIN|BLT_ENV, bltin(typeset),
|
||||||
|
"compound", NV_BLTIN|BLT_ENV|BLT_DCL, bltin(typeset),
|
||||||
|
"float", NV_BLTIN|BLT_ENV|BLT_DCL, bltin(typeset),
|
||||||
|
"functions", NV_BLTIN|BLT_ENV, bltin(typeset),
|
||||||
|
"integer", NV_BLTIN|BLT_ENV|BLT_DCL, bltin(typeset),
|
||||||
|
"nameref", NV_BLTIN|BLT_ENV|BLT_DCL, bltin(typeset),
|
||||||
"test", NV_BLTIN|BLT_ENV, bltin(test),
|
"test", NV_BLTIN|BLT_ENV, bltin(test),
|
||||||
"[", NV_BLTIN|BLT_ENV, bltin(test),
|
"[", NV_BLTIN|BLT_ENV, bltin(test),
|
||||||
"let", NV_BLTIN|BLT_ENV, bltin(let),
|
"let", NV_BLTIN|BLT_ENV, bltin(let),
|
||||||
|
@ -1745,29 +1751,30 @@ USAGE_LICENSE
|
||||||
;
|
;
|
||||||
|
|
||||||
const char sh_opttypeset[] =
|
const char sh_opttypeset[] =
|
||||||
"+[-1c?\n@(#)$Id: typeset (AT&T Research) 2010-12-08 $\n]"
|
"+[-1c?\n@(#)$Id: typeset (AT&T Research/ksh93) 2020-07-15 $\n]"
|
||||||
USAGE_LICENSE
|
USAGE_LICENSE
|
||||||
"[+NAME?\f?\f - declare or display variables with attributes]"
|
"[+NAME?typeset - declare or display variables with attributes]"
|
||||||
"[+DESCRIPTION?Without the \b-f\b option, \b\f?\f\b sets, unsets, "
|
"[+DESCRIPTION?Without the \b-f\b option, \btypeset\b sets, unsets, "
|
||||||
"or displays attributes of variables as specified with the "
|
"or displays attributes of variables as specified with the "
|
||||||
"options. If the first option is specified with a \b-\b "
|
"options. If the first option is specified with a \b-\b "
|
||||||
"then the attributes are set for each of the given \aname\as. "
|
"then the attributes are set for each of the given \aname\as. "
|
||||||
"If the first option is specified with a \b+\b, then the specified "
|
"If the first option is specified with a \b+\b, then the specified "
|
||||||
"attributes are unset. If \b=\b\avalue\a is specified value is "
|
"attributes are unset. If \b=\b\avalue\a is specified value is "
|
||||||
"assigned before the attributes are set.]"
|
"assigned before the attributes are set.]"
|
||||||
"[+?When \b\f?\f\b is called inside a function defined with the "
|
"[+?When \btypeset\b is called inside a function defined with the "
|
||||||
"\bfunction\b reserved word, and \aname\a does not contain a "
|
"\bfunction\b reserved word, and \aname\a does not contain a "
|
||||||
"\b.\b, then a local variable statically scoped to that function "
|
"\b.\b, then a local variable statically scoped to that function "
|
||||||
"will be created.]"
|
"will be created.]"
|
||||||
"[+?Not all option combinations are possible. For example, the numeric "
|
"[+?Not all option combinations are possible. For example, the numeric "
|
||||||
"options \b-i\b, \b-E\b, and \b-F\b cannot be specified with "
|
"options \b-i\b, \b-E\b, and \b-F\b cannot be specified with "
|
||||||
"the justification options \b-L\b, \b-R\b, and \b-Z\b.]"
|
"the justification options \b-L\b, \b-R\b, and \b-Z\b.]"
|
||||||
"[+?Note that the following preset aliases are set by the shell:]{"
|
"[+?Note also the following builtin command equivalents:]{"
|
||||||
"[+compound?\b\f?\f -C\b.]"
|
"[+autoload?\btypeset -fu\b]"
|
||||||
"[+float?\b\f?\f -lE\b.]"
|
"[+compound?\btypeset -C\b]"
|
||||||
"[+functions?\b\f?\f -f\b.]"
|
"[+float?\btypeset -lE\b]"
|
||||||
"[+integer?\b\f?\f -li\b.]"
|
"[+functions?\btypeset -f\b]"
|
||||||
"[+nameref?\b\f?\f -n\b.]"
|
"[+integer?\btypeset -li\b]"
|
||||||
|
"[+nameref?\btypeset -n\b]"
|
||||||
"}"
|
"}"
|
||||||
"[+?If no \aname\as are specified then variables that have the specified "
|
"[+?If no \aname\as are specified then variables that have the specified "
|
||||||
"options are displayed. If the first option is specified with "
|
"options are displayed. If the first option is specified with "
|
||||||
|
@ -1780,7 +1787,7 @@ USAGE_LICENSE
|
||||||
"[+?If \b-f\b is specified, then each \aname\a refers to a function "
|
"[+?If \b-f\b is specified, then each \aname\a refers to a function "
|
||||||
"and the only valid options are \b-u\b and \b-t\b. In this "
|
"and the only valid options are \b-u\b and \b-t\b. In this "
|
||||||
"case no \b=\b\avalue\a can be specified.]"
|
"case no \b=\b\avalue\a can be specified.]"
|
||||||
"[+?\b\f?\f\b is built-in to the shell as a declaration command so that "
|
"[+?\btypeset\b is built in to the shell as a declaration command so that "
|
||||||
"field splitting and pathname expansion are not performed on "
|
"field splitting and pathname expansion are not performed on "
|
||||||
"the arguments. Tilde expansion occurs on \avalue\a.]"
|
"the arguments. Tilde expansion occurs on \avalue\a.]"
|
||||||
#if 1
|
#if 1
|
||||||
|
|
|
@ -41,16 +41,25 @@
|
||||||
#define SYSCD (shgd->bltin_cmds+6) /* cd */
|
#define SYSCD (shgd->bltin_cmds+6) /* cd */
|
||||||
#define SYSBREAK (shgd->bltin_cmds+7) /* break */
|
#define SYSBREAK (shgd->bltin_cmds+7) /* break */
|
||||||
#define SYSCONT (shgd->bltin_cmds+8) /* continue */
|
#define SYSCONT (shgd->bltin_cmds+8) /* continue */
|
||||||
#define SYSTYPESET (shgd->bltin_cmds+9) /* typeset */
|
|
||||||
#define SYSTEST (shgd->bltin_cmds+10) /* test */
|
#define SYSTYPESET (shgd->bltin_cmds+9) /* typeset \ */
|
||||||
#define SYSBRACKET (shgd->bltin_cmds+11) /* [ */
|
/* autoload | */
|
||||||
#define SYSLET (shgd->bltin_cmds+12) /* let */
|
#define SYSCOMPOUND (shgd->bltin_cmds+11) /* compound | */
|
||||||
#define SYSEXPORT (shgd->bltin_cmds+13) /* export */
|
/* float >typeset range */
|
||||||
#define SYSDOT (shgd->bltin_cmds+14) /* . */
|
/* functions | */
|
||||||
#define SYSSOURCE (shgd->bltin_cmds+15) /* source */
|
/* integer | */
|
||||||
#define SYSRETURN (shgd->bltin_cmds+16) /* return */
|
#define SYSNAMEREF (shgd->bltin_cmds+15) /* nameref | */
|
||||||
|
#define SYSTYPESET_END (shgd->bltin_cmds+15) /* / */
|
||||||
|
|
||||||
|
#define SYSTEST (shgd->bltin_cmds+16) /* test */
|
||||||
|
#define SYSBRACKET (shgd->bltin_cmds+17) /* [ */
|
||||||
|
#define SYSLET (shgd->bltin_cmds+18) /* let */
|
||||||
|
#define SYSEXPORT (shgd->bltin_cmds+19) /* export */
|
||||||
|
#define SYSDOT (shgd->bltin_cmds+20) /* . */
|
||||||
|
#define SYSSOURCE (shgd->bltin_cmds+21) /* source */
|
||||||
|
#define SYSRETURN (shgd->bltin_cmds+22) /* return */
|
||||||
#if SHOPT_BASH
|
#if SHOPT_BASH
|
||||||
# define SYSLOCAL (shgd->bltin_cmds+17) /* local */
|
# define SYSLOCAL (shgd->bltin_cmds+23) /* local */
|
||||||
#else
|
#else
|
||||||
# define SYSLOCAL 0
|
# define SYSLOCAL 0
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -17,4 +17,4 @@
|
||||||
* David Korn <dgk@research.att.com> *
|
* David Korn <dgk@research.att.com> *
|
||||||
* *
|
* *
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
#define SH_RELEASE "93u+m 2020-07-14"
|
#define SH_RELEASE "93u+m 2020-07-15"
|
||||||
|
|
|
@ -788,20 +788,8 @@ but can be unset or redefined:
|
||||||
.RS 20
|
.RS 20
|
||||||
.PD 0
|
.PD 0
|
||||||
.TP
|
.TP
|
||||||
.B "autoload=\(fmtypeset \-fu\(fm"
|
|
||||||
.TP
|
|
||||||
.B "compound=\(fmtypeset \-C\(fm"
|
|
||||||
.TP
|
|
||||||
.B "float=\(fmtypeset \-lE\(fm"
|
|
||||||
.TP
|
|
||||||
.B "functions=\(fmtypeset \-f\(fm"
|
|
||||||
.TP
|
|
||||||
.B "history=\(fmhist \-l\(fm"
|
.B "history=\(fmhist \-l\(fm"
|
||||||
.TP
|
.TP
|
||||||
.B "integer=\(fmtypeset \-li\(fm"
|
|
||||||
.TP
|
|
||||||
.B "nameref=\(fmtypeset \-n\(fm"
|
|
||||||
.TP
|
|
||||||
.B "r=\(fmhist \-s\(fm"
|
.B "r=\(fmhist \-s\(fm"
|
||||||
.PD
|
.PD
|
||||||
.RE
|
.RE
|
||||||
|
@ -5476,10 +5464,10 @@ section from their manual page, and
|
||||||
as a request to print a brief usage message.
|
as a request to print a brief usage message.
|
||||||
All these are printed on standard error.
|
All these are printed on standard error.
|
||||||
There are advanced output options as well; see
|
There are advanced output options as well; see
|
||||||
.B getopts --man
|
.B getopts \-\-man
|
||||||
for more information.
|
for more information.
|
||||||
.PP
|
.PP
|
||||||
Commands that are preceded by one or two \(dg symbols below are
|
Commands that are preceded by a \(dg symbol below are
|
||||||
.I special\ built-in\ commands
|
.I special\ built-in\ commands
|
||||||
and are treated specially in the following ways:
|
and are treated specially in the following ways:
|
||||||
.PD 0
|
.PD 0
|
||||||
|
@ -5498,10 +5486,10 @@ that contains them to abort.
|
||||||
.TP
|
.TP
|
||||||
4.
|
4.
|
||||||
They are not valid function names.
|
They are not valid function names.
|
||||||
.TP
|
.PP
|
||||||
5.
|
Commands that are preceded by a \(dd symbol below are
|
||||||
Words
|
.IR declaration\ commands .
|
||||||
following a command preceded by \(dg\(dg
|
Any following words
|
||||||
that are in the format of a variable assignment
|
that are in the format of a variable assignment
|
||||||
are expanded with the same rules as a variable assignment.
|
are expanded with the same rules as a variable assignment.
|
||||||
This means that
|
This means that
|
||||||
|
@ -5509,9 +5497,6 @@ tilde substitution is performed after the
|
||||||
.B =
|
.B =
|
||||||
sign and field splitting and file name generation are not
|
sign and field splitting and file name generation are not
|
||||||
performed.
|
performed.
|
||||||
These are called
|
|
||||||
.I declaration\^
|
|
||||||
built-ins.
|
|
||||||
.PD
|
.PD
|
||||||
.TP
|
.TP
|
||||||
\(dg \f3:\fP \*(OK \f2arg\^\fP .\|.\|. \*(CK
|
\(dg \f3:\fP \*(OK \f2arg\^\fP .\|.\|. \*(CK
|
||||||
|
@ -5600,6 +5585,12 @@ The exit status is non-zero if a
|
||||||
is given, but no value, and no alias has been defined for the
|
is given, but no value, and no alias has been defined for the
|
||||||
.IR name\^ .
|
.IR name\^ .
|
||||||
.TP
|
.TP
|
||||||
|
\f3autoload\fP \f2name\^\fP .\|.\|.
|
||||||
|
Marks each \f2name\fP undefined so that the \f3FPATH\fP variable will be
|
||||||
|
searched to find the function definition when the function is referenced.
|
||||||
|
The same as
|
||||||
|
.BR typeset\ \-fu .
|
||||||
|
.TP
|
||||||
\f3bg\fP \*(OK \f2job\^\fP.\|.\|. \*(CK
|
\f3bg\fP \*(OK \f2job\^\fP.\|.\|. \*(CK
|
||||||
This command is only on systems that support job control.
|
This command is only on systems that support job control.
|
||||||
Puts each specified
|
Puts each specified
|
||||||
|
@ -5830,6 +5821,13 @@ option causes
|
||||||
to act like
|
to act like
|
||||||
.BR "whence \-v" .
|
.BR "whence \-v" .
|
||||||
.TP
|
.TP
|
||||||
|
\(dd \f3compound\fP \f2vname\fP\*(OK\f3=\fP\f2value\^\fP\*(CK .\|.\|.
|
||||||
|
Causes each
|
||||||
|
.I vname\^
|
||||||
|
to be a compound variable.
|
||||||
|
The same as
|
||||||
|
.BR typeset\ \-C .
|
||||||
|
.TP
|
||||||
\(dg \f3continue\fP \*(OK \f2n\^\fP \*(CK
|
\(dg \f3continue\fP \*(OK \f2n\^\fP \*(CK
|
||||||
Resume the next iteration of the enclosing
|
Resume the next iteration of the enclosing
|
||||||
.BR for\^ ,
|
.BR for\^ ,
|
||||||
|
@ -5874,7 +5872,7 @@ See
|
||||||
.IR echo (1)
|
.IR echo (1)
|
||||||
for usage and description.
|
for usage and description.
|
||||||
.TP
|
.TP
|
||||||
\(dg\(dg \f3enum\fP \*(OK \f3\-i\fP \*(CK \f2type\^\fP\*(OK=(\f2value\^\fP .\|.\|.) \*(CK
|
\(dd \f3enum\fP \*(OK \f3\-i\fP \*(CK \f2type\^\fP\*(OK=(\f2value\^\fP .\|.\|.) \*(CK
|
||||||
Creates a declaration command named \f2type\^\fP that is an
|
Creates a declaration command named \f2type\^\fP that is an
|
||||||
integer type that allows one of the specified \f2value\fPs as
|
integer type that allows one of the specified \f2value\fPs as
|
||||||
enumeration names. If \f3=(\fP\f2value\^\ .\|.\|.\|\fP\f3)\fP is
|
enumeration names. If \f3=(\fP\f2value\^\ .\|.\|.\|\fP\f3)\fP is
|
||||||
|
@ -5883,6 +5881,8 @@ least two elements and the values are taken from this array variable.
|
||||||
If
|
If
|
||||||
.B -i
|
.B -i
|
||||||
is specified the values are case insensitive.
|
is specified the values are case insensitive.
|
||||||
|
Declaration commands are created as special builtins that cannot be
|
||||||
|
removed or overridden by shell functions.
|
||||||
.TP
|
.TP
|
||||||
\(dg \f3eval\fP \*(OK \f2arg\^\fP .\|.\|. \*(CK
|
\(dg \f3eval\fP \*(OK \f2arg\^\fP .\|.\|. \*(CK
|
||||||
The arguments are read as input
|
The arguments are read as input
|
||||||
|
@ -5934,7 +5934,7 @@ option (see
|
||||||
.B set
|
.B set
|
||||||
below) turned on.
|
below) turned on.
|
||||||
.TP
|
.TP
|
||||||
\(dg\(dg \f3export\fP \*(OK \f3\-p\fP \*(CK \*(OK \f2name\^\fP\*(OK\f3=\fP\f2value\^\fP\*(CK \*(CK .\|.\|.
|
\(dg\(dd \f3export\fP \*(OK \f3\-p\fP \*(CK \*(OK \f2name\^\fP\*(OK\f3=\fP\f2value\^\fP\*(CK \*(CK .\|.\|.
|
||||||
If
|
If
|
||||||
.I name\^
|
.I name\^
|
||||||
is not given,
|
is not given,
|
||||||
|
@ -5988,6 +5988,16 @@ See
|
||||||
for a description of the format of
|
for a description of the format of
|
||||||
.IR job .
|
.IR job .
|
||||||
.TP
|
.TP
|
||||||
|
\(dd \f3float\fP \f2vname\fP\*(OK\f3=\fP\f2value\^\fP\*(CK .\|.\|.
|
||||||
|
Declares each \f2vname\fP to be a long floating point number.
|
||||||
|
The same as
|
||||||
|
.BR typeset\ \-lE .
|
||||||
|
.TP
|
||||||
|
\f3functions\fP \*(OK \f3\-Stux\^\fP \*(CK \*(OK \f2name\^\fP .\|.\|. \*(CK
|
||||||
|
Lists functions.
|
||||||
|
The same as
|
||||||
|
.BR typeset\ \-f .
|
||||||
|
.TP
|
||||||
\f3getconf\fP \*(OK \f2name\^\fP \*(OK \f2pathname\^\fP \*(CK \*(CK
|
\f3getconf\fP \*(OK \f2name\^\fP \*(OK \f2pathname\^\fP \*(CK \*(CK
|
||||||
Prints the current value of the configuration parameter given by
|
Prints the current value of the configuration parameter given by
|
||||||
.IR name .
|
.IR name .
|
||||||
|
@ -6201,6 +6211,11 @@ after the optional substitution
|
||||||
\f2old\^\fP\f3=\fP\f2new\^\fP
|
\f2old\^\fP\f3=\fP\f2new\^\fP
|
||||||
is performed.
|
is performed.
|
||||||
.TP
|
.TP
|
||||||
|
\(dd \f3integer\fP \f2vname\fP\*(OK\f3=\fP\f2value\^\fP\*(CK .\|.\|.
|
||||||
|
Declares each \f2vname\fP to be a long integer number.
|
||||||
|
The same as
|
||||||
|
.BR typeset\ \-li .
|
||||||
|
.TP
|
||||||
\f3jobs\fP \*(OK \f3\-lnp\^\fP \*(CK \*(OK \f2job\^\fP \.\|.\|. \*(CK
|
\f3jobs\fP \*(OK \f3\-lnp\^\fP \*(CK \*(OK \f2job\^\fP \.\|.\|. \*(CK
|
||||||
Lists information about each given job; or all active jobs if
|
Lists information about each given job; or all active jobs if
|
||||||
.I job
|
.I job
|
||||||
|
@ -6302,6 +6317,11 @@ The exit status is
|
||||||
0 if the value of the last expression
|
0 if the value of the last expression
|
||||||
is non-zero, and 1 otherwise.
|
is non-zero, and 1 otherwise.
|
||||||
.TP
|
.TP
|
||||||
|
\(dd \f3nameref\fP \f2vname\fP\*(OK\f3=\fP\f2refname\^\fP\*(CK .\|.\|.
|
||||||
|
Declares each \f2vname\fP to be a variable name reference.
|
||||||
|
The same as
|
||||||
|
.BR typeset\ \-n .
|
||||||
|
.TP
|
||||||
\f3print\fP \*(OK \f3\-CRenprsv\^\fP \*(CK \*(OK \f3\-u\fP \f2unit \^\fP\*(CK \*(OK \f3\-f\fP \f2format\^\fP \*(CK \*(OK \f2arg\^\fP .\|.\|. \*(CK
|
\f3print\fP \*(OK \f3\-CRenprsv\^\fP \*(CK \*(OK \f3\-u\fP \f2unit \^\fP\*(CK \*(OK \f3\-f\fP \f2format\^\fP \*(CK \*(OK \f2arg\^\fP .\|.\|. \*(CK
|
||||||
With no options or with option
|
With no options or with option
|
||||||
.B \-
|
.B \-
|
||||||
|
@ -6730,7 +6750,7 @@ or
|
||||||
.B read
|
.B read
|
||||||
has timed out.
|
has timed out.
|
||||||
.TP
|
.TP
|
||||||
\(dg\(dg \f3readonly\fP \*(OK \f3\-p\fP \*(CK \*(OK \f2vname\fP\*(OK\f3=\fP\f2value\^\fP\*(CK \*(CK .\|.\|.
|
\(dg\(dd \f3readonly\fP \*(OK \f3\-p\fP \*(CK \*(OK \f2vname\fP\*(OK\f3=\fP\f2value\^\fP\*(CK \*(CK .\|.\|.
|
||||||
If
|
If
|
||||||
.I vname\^
|
.I vname\^
|
||||||
is not given,
|
is not given,
|
||||||
|
@ -7299,9 +7319,9 @@ for infinite loops.
|
||||||
.TP
|
.TP
|
||||||
\f3type\fP \*(OK \f3\-afp\fP \*(CK \f2name\^\fP .\|.\|.
|
\f3type\fP \*(OK \f3\-afp\fP \*(CK \f2name\^\fP .\|.\|.
|
||||||
The same as
|
The same as
|
||||||
.BR whence\ -v .
|
.BR whence\ \-v .
|
||||||
.TP
|
.TP
|
||||||
\(dg\(dg \f3typeset\fP \*(OK \f3\(+-ACHSfblmnprtux\^\fP \*(CK \*(OK \f3\(+-EFLRXZi\*(OK\f2n\^\fP\*(CK \*(CK \*(OK \f3\+-M \*(OK \f2mapname\fP \*(CK \*(CK \*(OK \f3\-T \*(OK \f2tname\fP=(\f2assign_list\fP) \*(CK \*(CK \*(OK \f3\-h \f2str\fP \*(CK \*(OK \f3\-a\fP \*(OK\f2type\fP\*(CK \*(CK \*(OK \f2vname\^\fP\*(OK\f3=\fP\f2value\^\fP \*(CK \^ \*(CK .\|.\|.
|
\(dg\(dd \f3typeset\fP \*(OK \f3\(+-ACHSfblmnprtux\^\fP \*(CK \*(OK \f3\(+-EFLRXZi\*(OK\f2n\^\fP\*(CK \*(CK \*(OK \f3\+-M \*(OK \f2mapname\fP \*(CK \*(CK \*(OK \f3\-T \*(OK \f2tname\fP=(\f2assign_list\fP) \*(CK \*(CK \*(OK \f3\-h \f2str\fP \*(CK \*(OK \f3\-a\fP \*(OK\f2type\fP\*(CK \*(CK \*(OK \f2vname\^\fP\*(OK\f3=\fP\f2value\^\fP \*(CK \^ \*(CK .\|.\|.
|
||||||
Sets attributes and values for shell variables and functions.
|
Sets attributes and values for shell variables and functions.
|
||||||
When invoked inside a function defined with the
|
When invoked inside a function defined with the
|
||||||
.B function
|
.B function
|
||||||
|
@ -7326,9 +7346,9 @@ expressions.
|
||||||
.B \-C
|
.B \-C
|
||||||
causes each
|
causes each
|
||||||
.I vname\^
|
.I vname\^
|
||||||
to be a compound variable.
|
to be a compound variable. If
|
||||||
.I value\^
|
.I value\^
|
||||||
names a compound variable it is copied into
|
names a compound variable, it is copied into
|
||||||
.IR vname .
|
.IR vname .
|
||||||
Otherwise, it unsets each
|
Otherwise, it unsets each
|
||||||
.IR vname .
|
.IR vname .
|
||||||
|
|
|
@ -1478,7 +1478,7 @@ static Shnode_t *simple(Lex_t *lexp,int flag, struct ionod *io)
|
||||||
if(nv_isattr(np,BLT_DCL))
|
if(nv_isattr(np,BLT_DCL))
|
||||||
{
|
{
|
||||||
assignment = 1;
|
assignment = 1;
|
||||||
if(np==SYSTYPESET)
|
if(np >= SYSTYPESET && np <= SYSTYPESET_END)
|
||||||
lexp->intypeset = 1;
|
lexp->intypeset = 1;
|
||||||
key_on = 1;
|
key_on = 1;
|
||||||
}
|
}
|
||||||
|
@ -1517,7 +1517,9 @@ static Shnode_t *simple(Lex_t *lexp,int flag, struct ionod *io)
|
||||||
int intypeset = lexp->intypeset;
|
int intypeset = lexp->intypeset;
|
||||||
int type = 0;
|
int type = 0;
|
||||||
lexp->intypeset = 0;
|
lexp->intypeset = 0;
|
||||||
if(t->comnamp==SYSTYPESET)
|
if(t->comnamp == SYSCOMPOUND)
|
||||||
|
type = NV_COMVAR;
|
||||||
|
else if((Namval_t*)t->comnamp >= SYSTYPESET && (Namval_t*)t->comnamp <= SYSTYPESET_END)
|
||||||
{
|
{
|
||||||
struct argnod *ap;
|
struct argnod *ap;
|
||||||
for(ap=t->comarg->argnxt.ap;ap;ap=ap->argnxt.ap)
|
for(ap=t->comarg->argnxt.ap;ap;ap=ap->argnxt.ap)
|
||||||
|
|
|
@ -1295,20 +1295,21 @@ int sh_exec(register const Shnode_t *t, int flags)
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif /* SHOPT_BASH */
|
#endif /* SHOPT_BASH */
|
||||||
if(np==SYSTYPESET || (np && np->nvalue.bfp==SYSTYPESET->nvalue.bfp))
|
if(np && np->nvalue.bfp==SYSTYPESET->nvalue.bfp)
|
||||||
{
|
{
|
||||||
if(np!=SYSTYPESET)
|
/* command calls b_typeset(); treat as a typeset variant */
|
||||||
|
if(np < SYSTYPESET || np > SYSTYPESET_END)
|
||||||
{
|
{
|
||||||
shp->typeinit = np;
|
shp->typeinit = np;
|
||||||
tp = nv_type(np);
|
tp = nv_type(np);
|
||||||
}
|
}
|
||||||
if(checkopt(com,'C'))
|
if(np==SYSCOMPOUND || checkopt(com,'C'))
|
||||||
flgs |= NV_COMVAR;
|
flgs |= NV_COMVAR;
|
||||||
if(checkopt(com,'S'))
|
if(checkopt(com,'S'))
|
||||||
flgs |= NV_STATIC;
|
flgs |= NV_STATIC;
|
||||||
if(checkopt(com,'m'))
|
if(checkopt(com,'m'))
|
||||||
flgs |= NV_MOVE;
|
flgs |= NV_MOVE;
|
||||||
if(checkopt(com,'n'))
|
if(np==SYSNAMEREF || checkopt(com,'n'))
|
||||||
flgs |= NV_NOREF;
|
flgs |= NV_NOREF;
|
||||||
#if SHOPT_TYPEDEF
|
#if SHOPT_TYPEDEF
|
||||||
else if(argn>=3 && checkopt(com,'T'))
|
else if(argn>=3 && checkopt(com,'T'))
|
||||||
|
|
|
@ -496,8 +496,9 @@ chmod +x $tmp/script
|
||||||
)
|
)
|
||||||
TIMEFORMAT='this is a test'
|
TIMEFORMAT='this is a test'
|
||||||
[[ $(set +x; { { time :;} 2>&1;}) == "$TIMEFORMAT" ]] || err_exit 'TIMEFORMAT not working'
|
[[ $(set +x; { { time :;} 2>&1;}) == "$TIMEFORMAT" ]] || err_exit 'TIMEFORMAT not working'
|
||||||
|
alias _test_alias=true
|
||||||
: ${.sh.version}
|
: ${.sh.version}
|
||||||
[[ $(alias integer) == *.sh.* ]] && err_exit '.sh. prefixed to alias name'
|
[[ $(alias _test_alias) == *.sh.* ]] && err_exit '.sh. prefixed to alias name'
|
||||||
: ${.sh.version}
|
: ${.sh.version}
|
||||||
[[ $(whence rm) == *.sh.* ]] && err_exit '.sh. prefixed to tracked alias name'
|
[[ $(whence rm) == *.sh.* ]] && err_exit '.sh. prefixed to tracked alias name'
|
||||||
: ${.sh.version}
|
: ${.sh.version}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue