get rid of special "POSIX"ish mode
This commit is contained in:
14
check.t
14
check.t
@ -1,4 +1,4 @@
|
|||||||
# $MirOS: src/bin/mksh/check.t,v 1.19 2005/07/04 11:57:55 tg Exp $
|
# $MirOS: src/bin/mksh/check.t,v 1.20 2005/07/04 12:27:25 tg Exp $
|
||||||
# $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $
|
# $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $
|
||||||
# $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $
|
# $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $
|
||||||
# $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $
|
# $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $
|
||||||
@ -3637,14 +3637,18 @@ name: xxx-param-subst-qmark-1
|
|||||||
description:
|
description:
|
||||||
Check suppresion of error message with null string. According to
|
Check suppresion of error message with null string. According to
|
||||||
POSIX, it shouldn't print the error as 'word' isn't ommitted.
|
POSIX, it shouldn't print the error as 'word' isn't ommitted.
|
||||||
ksh88, Solaris /bin/sh and /usr/xpg4/bin/sh all print the error?!
|
ksh88, Solaris /bin/sh and /usr/xpg4/bin/sh all print the error,
|
||||||
|
that's why the condition is reversed.
|
||||||
stdin:
|
stdin:
|
||||||
unset foo
|
unset foo
|
||||||
x=
|
x=
|
||||||
echo x${foo?$x}
|
echo x${foo?$x}
|
||||||
expected-exit: 1
|
expected-exit: 1
|
||||||
expected-fail: yes
|
# POSIX
|
||||||
expected-stderr-pattern: !/not set/
|
#expected-fail: yes
|
||||||
|
#expected-stderr-pattern: !/not set/
|
||||||
|
# common use
|
||||||
|
expected-stderr-pattern: /parameter null or not set/
|
||||||
---
|
---
|
||||||
name: xxx-param-_-1
|
name: xxx-param-_-1
|
||||||
description:
|
description:
|
||||||
@ -3658,7 +3662,7 @@ description:
|
|||||||
env-setup: !HOME=/sweet!
|
env-setup: !HOME=/sweet!
|
||||||
stdin:
|
stdin:
|
||||||
echo ${A=a=}~ b=~ c=d~ ~
|
echo ${A=a=}~ b=~ c=d~ ~
|
||||||
set -o posix
|
set +o braceexpand
|
||||||
echo ${A=a=}~ b=~ c=d~ ~
|
echo ${A=a=}~ b=~ c=d~ ~
|
||||||
expected-stdout:
|
expected-stdout:
|
||||||
a=/sweet b=/sweet c=d~ /sweet
|
a=/sweet b=/sweet c=d~ /sweet
|
||||||
|
9
eval.c
9
eval.c
@ -1,4 +1,4 @@
|
|||||||
/** $MirOS: src/bin/mksh/eval.c,v 1.4 2005/06/08 22:34:03 tg Exp $ */
|
/** $MirOS: src/bin/mksh/eval.c,v 1.5 2005/07/04 12:27:25 tg Exp $ */
|
||||||
/* $OpenBSD: eval.c,v 1.27 2005/03/30 17:16:37 deraadt Exp $ */
|
/* $OpenBSD: eval.c,v 1.27 2005/03/30 17:16:37 deraadt Exp $ */
|
||||||
|
|
||||||
#include "sh.h"
|
#include "sh.h"
|
||||||
@ -6,7 +6,7 @@
|
|||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/eval.c,v 1.4 2005/06/08 22:34:03 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/eval.c,v 1.5 2005/07/04 12:27:25 tg Exp $");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* string expansion
|
* string expansion
|
||||||
@ -613,8 +613,9 @@ expand(char *cp, /* input word */
|
|||||||
break;
|
break;
|
||||||
case '=':
|
case '=':
|
||||||
/* Note first unquoted = for ~ */
|
/* Note first unquoted = for ~ */
|
||||||
if (!(f & DOTEMP_) && (!Flag(FPOSIX)
|
if (!(f & DOTEMP_) && !saw_eq &&
|
||||||
|| (f & DOASNTILDE)) && !saw_eq) {
|
(Flag(FBRACEEXPAND) ||
|
||||||
|
(f & DOASNTILDE))) {
|
||||||
saw_eq = 1;
|
saw_eq = 1;
|
||||||
tilde_ok = 1;
|
tilde_ok = 1;
|
||||||
}
|
}
|
||||||
|
12
exec.c
12
exec.c
@ -1,11 +1,11 @@
|
|||||||
/** $MirOS: src/bin/mksh/exec.c,v 1.5 2005/05/25 14:07:29 tg Exp $ */
|
/** $MirOS: src/bin/mksh/exec.c,v 1.6 2005/07/04 12:27:25 tg Exp $ */
|
||||||
/* $OpenBSD: exec.c,v 1.41 2005/03/30 17:16:37 deraadt Exp $ */
|
/* $OpenBSD: exec.c,v 1.41 2005/03/30 17:16:37 deraadt Exp $ */
|
||||||
|
|
||||||
#include "sh.h"
|
#include "sh.h"
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/exec.c,v 1.5 2005/05/25 14:07:29 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/exec.c,v 1.6 2005/07/04 12:27:25 tg Exp $");
|
||||||
|
|
||||||
static int comexec(struct op *, struct tbl *volatile, char **,
|
static int comexec(struct op *, struct tbl *volatile, char **,
|
||||||
int volatile);
|
int volatile);
|
||||||
@ -844,14 +844,6 @@ findcom(const char *name, int flags)
|
|||||||
}
|
}
|
||||||
if (!tp && (flags & FC_REGBI) && tbi && (tbi->flag & REG_BI))
|
if (!tp && (flags & FC_REGBI) && tbi && (tbi->flag & REG_BI))
|
||||||
tp = tbi;
|
tp = tbi;
|
||||||
/* todo: posix says non-special/non-regular builtins must
|
|
||||||
* be triggered by some user-controllable means like a
|
|
||||||
* special directory in PATH. Requires modifications to
|
|
||||||
* the search() function. Tracked aliases should be
|
|
||||||
* modified to allow tracking of builtin commands.
|
|
||||||
* This should be under control of the FPOSIX flag.
|
|
||||||
* If this is changed, also change c_whence...
|
|
||||||
*/
|
|
||||||
if (!tp && (flags & FC_UNREGBI) && tbi)
|
if (!tp && (flags & FC_UNREGBI) && tbi)
|
||||||
tp = tbi;
|
tp = tbi;
|
||||||
if (!tp && (flags & FC_PATH) && !(flags & FC_DEFPATH)) {
|
if (!tp && (flags & FC_PATH) && !(flags & FC_DEFPATH)) {
|
||||||
|
83
funcs.c
83
funcs.c
@ -1,4 +1,4 @@
|
|||||||
/** $MirOS: src/bin/mksh/funcs.c,v 1.12 2005/06/24 15:40:38 tg Exp $ */
|
/** $MirOS: src/bin/mksh/funcs.c,v 1.13 2005/07/04 12:27:26 tg Exp $ */
|
||||||
/* $OpenBSD: c_ksh.c,v 1.27 2005/03/30 17:16:37 deraadt Exp $ */
|
/* $OpenBSD: c_ksh.c,v 1.27 2005/03/30 17:16:37 deraadt Exp $ */
|
||||||
/* $OpenBSD: c_sh.c,v 1.29 2005/03/30 17:16:37 deraadt Exp $ */
|
/* $OpenBSD: c_sh.c,v 1.29 2005/03/30 17:16:37 deraadt Exp $ */
|
||||||
/* $OpenBSD: c_test.c,v 1.17 2005/03/30 17:16:37 deraadt Exp $ */
|
/* $OpenBSD: c_test.c,v 1.17 2005/03/30 17:16:37 deraadt Exp $ */
|
||||||
@ -13,7 +13,7 @@
|
|||||||
#include <ulimit.h>
|
#include <ulimit.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.12 2005/06/24 15:40:38 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.13 2005/07/04 12:27:26 tg Exp $");
|
||||||
|
|
||||||
int
|
int
|
||||||
c_cd(char **wp)
|
c_cd(char **wp)
|
||||||
@ -1076,10 +1076,7 @@ c_fgbg(char **wp)
|
|||||||
rv = j_resume(*wp, bg);
|
rv = j_resume(*wp, bg);
|
||||||
else
|
else
|
||||||
rv = j_resume("%%", bg);
|
rv = j_resume("%%", bg);
|
||||||
/* POSIX says fg shall return 0 (unless an error occurs).
|
return bg ? 0 : rv;
|
||||||
* at&t ksh returns the exit value of the job...
|
|
||||||
*/
|
|
||||||
return (bg || Flag(FPOSIX)) ? 0 : rv;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct kill_info {
|
struct kill_info {
|
||||||
@ -1164,12 +1161,6 @@ c_kill(char **wp)
|
|||||||
else
|
else
|
||||||
shprintf("%d\n", n);
|
shprintf("%d\n", n);
|
||||||
}
|
}
|
||||||
} else if (Flag(FPOSIX)) {
|
|
||||||
p = null;
|
|
||||||
for (i = 1; i < NSIG; i++, p = space)
|
|
||||||
if (sigtraps[i].name)
|
|
||||||
shprintf("%s%s", p, sigtraps[i].name);
|
|
||||||
shprintf(newline);
|
|
||||||
} else {
|
} else {
|
||||||
int w, j;
|
int w, j;
|
||||||
int mess_width;
|
int mess_width;
|
||||||
@ -1222,8 +1213,7 @@ void
|
|||||||
getopts_reset(int val)
|
getopts_reset(int val)
|
||||||
{
|
{
|
||||||
if (val >= 1) {
|
if (val >= 1) {
|
||||||
ksh_getopt_reset(&user_opt,
|
ksh_getopt_reset(&user_opt, GF_NONAME | GF_PLUSOPT);
|
||||||
GF_NONAME | (Flag(FPOSIX) ? 0 : GF_PLUSOPT));
|
|
||||||
user_opt.optind = user_opt.uoptind = val;
|
user_opt.optind = user_opt.uoptind = val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1799,33 +1789,32 @@ c_eval(char **wp)
|
|||||||
return 1;
|
return 1;
|
||||||
s = pushs(SWORDS, ATEMP);
|
s = pushs(SWORDS, ATEMP);
|
||||||
s->u.strv = wp + builtin_opt.optind;
|
s->u.strv = wp + builtin_opt.optind;
|
||||||
if (!Flag(FPOSIX)) {
|
|
||||||
/*
|
/*
|
||||||
* Handle case where the command is empty due to failed
|
* Handle case where the command is empty due to failed
|
||||||
* command substitution, eg, eval "$(false)".
|
* command substitution, eg, eval "$(false)".
|
||||||
* In this case, shell() will not set/change exstat (because
|
* In this case, shell() will not set/change exstat (because
|
||||||
* compiled tree is empty), so will use this value.
|
* compiled tree is empty), so will use this value.
|
||||||
* subst_exstat is cleared in execute(), so should be 0 if
|
* subst_exstat is cleared in execute(), so should be 0 if
|
||||||
* there were no substitutions.
|
* there were no substitutions.
|
||||||
*
|
*
|
||||||
* A strict reading of POSIX says we don't do this (though
|
* A strict reading of POSIX says we don't do this (though
|
||||||
* it is traditionally done). [from 1003.2-1992]
|
* it is traditionally done). [from 1003.2-1992]
|
||||||
* 3.9.1: Simple Commands
|
* 3.9.1: Simple Commands
|
||||||
* ... If there is a command name, execution shall
|
* ... If there is a command name, execution shall
|
||||||
* continue as described in 3.9.1.1. If there
|
* continue as described in 3.9.1.1. If there
|
||||||
* is no command name, but the command contained a command
|
* is no command name, but the command contained a command
|
||||||
* substitution, the command shall complete with the exit
|
* substitution, the command shall complete with the exit
|
||||||
* status of the last command substitution
|
* status of the last command substitution
|
||||||
* 3.9.1.1: Command Search and Execution
|
* 3.9.1.1: Command Search and Execution
|
||||||
* ...(1)...(a) If the command name matches the name of
|
* ...(1)...(a) If the command name matches the name of
|
||||||
* a special built-in utility, that special built-in
|
* a special built-in utility, that special built-in
|
||||||
* utility shall be invoked.
|
* utility shall be invoked.
|
||||||
* 3.14.5: Eval
|
* 3.14.5: Eval
|
||||||
* ... If there are no arguments, or only null arguments,
|
* ... If there are no arguments, or only null arguments,
|
||||||
* eval shall return an exit status of zero.
|
* eval shall return an exit status of zero.
|
||||||
*/
|
*/
|
||||||
exstat = subst_exstat;
|
exstat = subst_exstat;
|
||||||
}
|
|
||||||
|
|
||||||
savef = Flag(FERREXIT);
|
savef = Flag(FERREXIT);
|
||||||
Flag(FERREXIT) = 0;
|
Flag(FERREXIT) = 0;
|
||||||
@ -2009,7 +1998,7 @@ c_set(char **wp)
|
|||||||
* (subst_exstat is cleared in execute() so that it will be 0
|
* (subst_exstat is cleared in execute() so that it will be 0
|
||||||
* if there are no command substitutions).
|
* if there are no command substitutions).
|
||||||
*/
|
*/
|
||||||
return Flag(FPOSIX) ? 0 : subst_exstat;
|
return subst_exstat;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -2387,11 +2376,7 @@ c_test(char **wp)
|
|||||||
}
|
}
|
||||||
if (argc == 1) {
|
if (argc == 1) {
|
||||||
opnd1 = (*te.getopnd)(&te, TO_NONOP, 1);
|
opnd1 = (*te.getopnd)(&te, TO_NONOP, 1);
|
||||||
/* Historically, -t by itself test if fd 1
|
if (strcmp(opnd1, "-t") == 0)
|
||||||
* is a file descriptor, but POSIX says its
|
|
||||||
* a string test...
|
|
||||||
*/
|
|
||||||
if (!Flag(FPOSIX) && strcmp(opnd1, "-t") == 0)
|
|
||||||
break;
|
break;
|
||||||
res = (*te.eval)(&te, TO_STNZE, opnd1,
|
res = (*te.eval)(&te, TO_STNZE, opnd1,
|
||||||
NULL, 1);
|
NULL, 1);
|
||||||
@ -2507,10 +2492,8 @@ test_eval(Test_env *te, Test_op op, const char *opnd1, const char *opnd2,
|
|||||||
if (opnd1 && !bi_getn(opnd1, &res)) {
|
if (opnd1 && !bi_getn(opnd1, &res)) {
|
||||||
te->flags |= TEF_ERROR;
|
te->flags |= TEF_ERROR;
|
||||||
res = 0;
|
res = 0;
|
||||||
} else {
|
} else
|
||||||
/* generate error if in FPOSIX mode? */
|
|
||||||
res = isatty(opnd1 ? res : 0);
|
res = isatty(opnd1 ? res : 0);
|
||||||
}
|
|
||||||
return res;
|
return res;
|
||||||
case TO_FILUID: /* -O */
|
case TO_FILUID: /* -O */
|
||||||
return test_stat(opnd1, &b1) == 0 && b1.st_uid == ksheuid;
|
return test_stat(opnd1, &b1) == 0 && b1.st_uid == ksheuid;
|
||||||
|
9
jobs.c
9
jobs.c
@ -1,4 +1,4 @@
|
|||||||
/** $MirOS: src/bin/mksh/jobs.c,v 1.2 2005/05/23 16:23:19 tg Exp $ */
|
/** $MirOS: src/bin/mksh/jobs.c,v 1.3 2005/07/04 12:27:26 tg Exp $ */
|
||||||
/* $OpenBSD: jobs.c,v 1.34 2005/03/30 17:16:37 deraadt Exp $ */
|
/* $OpenBSD: jobs.c,v 1.34 2005/03/30 17:16:37 deraadt Exp $ */
|
||||||
|
|
||||||
#include "sh.h"
|
#include "sh.h"
|
||||||
@ -7,7 +7,7 @@
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/jobs.c,v 1.2 2005/05/23 16:23:19 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/jobs.c,v 1.3 2005/07/04 12:27:26 tg Exp $");
|
||||||
|
|
||||||
/* Order important! */
|
/* Order important! */
|
||||||
#define PRUNNING 0
|
#define PRUNNING 0
|
||||||
@ -1310,9 +1310,8 @@ j_lookup(const char *cp, int *ecodep)
|
|||||||
for (j = job_list; j != NULL; j = j->next)
|
for (j = job_list; j != NULL; j = j->next)
|
||||||
if (j->last_proc && j->last_proc->pid == job)
|
if (j->last_proc && j->last_proc->pid == job)
|
||||||
return j;
|
return j;
|
||||||
/* ...then look for process group (this is non-POSIX),
|
/* ...then look for process group (this is non-POSIX,
|
||||||
* but should not break anything (so FPOSIX isn't used).
|
* but should not break anything */
|
||||||
*/
|
|
||||||
for (j = job_list; j != NULL; j = j->next)
|
for (j = job_list; j != NULL; j = j->next)
|
||||||
if (j->pgrp && j->pgrp == job)
|
if (j->pgrp && j->pgrp == job)
|
||||||
return j;
|
return j;
|
||||||
|
36
lex.c
36
lex.c
@ -1,11 +1,11 @@
|
|||||||
/** $MirOS: src/bin/mksh/lex.c,v 1.4 2005/06/08 22:34:03 tg Exp $ */
|
/** $MirOS: src/bin/mksh/lex.c,v 1.5 2005/07/04 12:27:26 tg Exp $ */
|
||||||
/* $OpenBSD: lex.c,v 1.36 2005/03/30 17:16:37 deraadt Exp $ */
|
/* $OpenBSD: lex.c,v 1.36 2005/03/30 17:16:37 deraadt Exp $ */
|
||||||
|
|
||||||
#include "sh.h"
|
#include "sh.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.4 2005/06/08 22:34:03 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.5 2005/07/04 12:27:26 tg Exp $");
|
||||||
|
|
||||||
/* Structure to keep track of the lexing state and the various pieces of info
|
/* Structure to keep track of the lexing state and the various pieces of info
|
||||||
* needed for each particular state. */
|
* needed for each particular state. */
|
||||||
@ -138,11 +138,7 @@ yylex(int cf)
|
|||||||
}
|
}
|
||||||
if (source->flags & SF_ALIAS) { /* trailing ' ' in alias definition */
|
if (source->flags & SF_ALIAS) { /* trailing ' ' in alias definition */
|
||||||
source->flags &= ~SF_ALIAS;
|
source->flags &= ~SF_ALIAS;
|
||||||
/* In POSIX mode, a trailing space only counts if we are
|
cf |= ALIAS;
|
||||||
* parsing a simple command
|
|
||||||
*/
|
|
||||||
if (!Flag(FPOSIX) || (cf & CMDWORD))
|
|
||||||
cf |= ALIAS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initial state: one of SBASE SHEREDELIM SWORD SASPAREN */
|
/* Initial state: one of SBASE SHEREDELIM SWORD SASPAREN */
|
||||||
@ -323,22 +319,20 @@ yylex(int cf)
|
|||||||
* $ ` \.").
|
* $ ` \.").
|
||||||
*/
|
*/
|
||||||
statep->ls_sbquote.indquotes = 0;
|
statep->ls_sbquote.indquotes = 0;
|
||||||
if (!Flag(FPOSIX)) {
|
Lex_state *s = statep;
|
||||||
Lex_state *s = statep;
|
Lex_state *base = state_info.base;
|
||||||
Lex_state *base = state_info.base;
|
while (1) {
|
||||||
while (1) {
|
for (; s != base; s--) {
|
||||||
for (; s != base; s--) {
|
if (s->ls_state == SDQUOTE) {
|
||||||
if (s->ls_state == SDQUOTE) {
|
statep->ls_sbquote.indquotes = 1;
|
||||||
statep->ls_sbquote.indquotes = 1;
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (s != base)
|
|
||||||
break;
|
|
||||||
if (!(s = s->ls_info.base))
|
|
||||||
break;
|
|
||||||
base = s-- - STATE_BSIZE;
|
|
||||||
}
|
}
|
||||||
|
if (s != base)
|
||||||
|
break;
|
||||||
|
if (!(s = s->ls_info.base))
|
||||||
|
break;
|
||||||
|
base = s-- - STATE_BSIZE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case QCHAR:
|
case QCHAR:
|
||||||
|
11
main.c
11
main.c
@ -1,4 +1,4 @@
|
|||||||
/** $MirOS: src/bin/mksh/main.c,v 1.17 2005/07/04 11:57:55 tg Exp $ */
|
/** $MirOS: src/bin/mksh/main.c,v 1.18 2005/07/04 12:27:26 tg Exp $ */
|
||||||
/* $OpenBSD: main.c,v 1.38 2005/03/30 17:16:37 deraadt Exp $ */
|
/* $OpenBSD: main.c,v 1.38 2005/03/30 17:16:37 deraadt Exp $ */
|
||||||
/* $OpenBSD: tty.c,v 1.8 2005/03/30 17:16:37 deraadt Exp $ */
|
/* $OpenBSD: tty.c,v 1.8 2005/03/30 17:16:37 deraadt Exp $ */
|
||||||
/* $OpenBSD: io.c,v 1.21 2005/03/30 17:16:37 deraadt Exp $ */
|
/* $OpenBSD: io.c,v 1.21 2005/03/30 17:16:37 deraadt Exp $ */
|
||||||
@ -13,7 +13,7 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/main.c,v 1.17 2005/07/04 11:57:55 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/main.c,v 1.18 2005/07/04 12:27:26 tg Exp $");
|
||||||
|
|
||||||
const char ksh_version[] = "@(#)MIRBSD KSH R23 2005/07/04";
|
const char ksh_version[] = "@(#)MIRBSD KSH R23 2005/07/04";
|
||||||
|
|
||||||
@ -152,9 +152,7 @@ main(int argc, char *argv[])
|
|||||||
Flag(FNOHUP) = 1;
|
Flag(FNOHUP) = 1;
|
||||||
|
|
||||||
/* Turn on brace expansion by default. At&t kshs that have
|
/* Turn on brace expansion by default. At&t kshs that have
|
||||||
* alternation always have it on. BUT, posix doesn't have
|
* alternation always have it on.
|
||||||
* brace expansion, so set this before setting up FPOSIX
|
|
||||||
* (change_flag() clears FBRACEEXPAND when FPOSIX is set).
|
|
||||||
*/
|
*/
|
||||||
Flag(FBRACEEXPAND) = 1;
|
Flag(FBRACEEXPAND) = 1;
|
||||||
|
|
||||||
@ -807,8 +805,7 @@ bi_errorf(const char *fmt, ...)
|
|||||||
* non-interactive shells to exit.
|
* non-interactive shells to exit.
|
||||||
* XXX odd use of KEEPASN; also may not want LERROR here
|
* XXX odd use of KEEPASN; also may not want LERROR here
|
||||||
*/
|
*/
|
||||||
if ((builtin_flag & SPEC_BI) ||
|
if (builtin_flag & SPEC_BI) {
|
||||||
(Flag(FPOSIX) && (builtin_flag & KEEPASN))) {
|
|
||||||
builtin_argv0 = NULL;
|
builtin_argv0 = NULL;
|
||||||
unwind(LERROR);
|
unwind(LERROR);
|
||||||
}
|
}
|
||||||
|
12
misc.c
12
misc.c
@ -1,4 +1,4 @@
|
|||||||
/** $MirOS: src/bin/mksh/misc.c,v 1.4 2005/05/25 13:46:01 tg Exp $ */
|
/** $MirOS: src/bin/mksh/misc.c,v 1.5 2005/07/04 12:27:27 tg Exp $ */
|
||||||
/* $OpenBSD: misc.c,v 1.28 2005/03/30 17:16:37 deraadt Exp $ */
|
/* $OpenBSD: misc.c,v 1.28 2005/03/30 17:16:37 deraadt Exp $ */
|
||||||
/* $OpenBSD: path.c,v 1.12 2005/03/30 17:16:37 deraadt Exp $ */
|
/* $OpenBSD: path.c,v 1.12 2005/03/30 17:16:37 deraadt Exp $ */
|
||||||
|
|
||||||
@ -7,7 +7,7 @@
|
|||||||
#include <sys/param.h> /* for MAXPATHLEN */
|
#include <sys/param.h> /* for MAXPATHLEN */
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/misc.c,v 1.4 2005/05/25 13:46:01 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/misc.c,v 1.5 2005/07/04 12:27:27 tg Exp $");
|
||||||
|
|
||||||
short chtypes[UCHAR_MAX+1]; /* type bits for unsigned char */
|
short chtypes[UCHAR_MAX+1]; /* type bits for unsigned char */
|
||||||
|
|
||||||
@ -251,6 +251,10 @@ change_flag(enum sh_flag f,
|
|||||||
{
|
{
|
||||||
int oldval;
|
int oldval;
|
||||||
|
|
||||||
|
/* disabled functionality */
|
||||||
|
if (f == FPOSIX)
|
||||||
|
return;
|
||||||
|
|
||||||
oldval = Flag(f);
|
oldval = Flag(f);
|
||||||
Flag(f) = newval;
|
Flag(f) = newval;
|
||||||
if (f == FMONITOR) {
|
if (f == FMONITOR) {
|
||||||
@ -268,8 +272,6 @@ change_flag(enum sh_flag f,
|
|||||||
setuid(ksheuid);
|
setuid(ksheuid);
|
||||||
setegid(kshegid = kshgid = getgid());
|
setegid(kshegid = kshgid = getgid());
|
||||||
setgid(kshegid);
|
setgid(kshegid);
|
||||||
} else if (f == FPOSIX && newval) {
|
|
||||||
Flag(FBRACEEXPAND) = 0;
|
|
||||||
}
|
}
|
||||||
/* Changing interactive flag? */
|
/* Changing interactive flag? */
|
||||||
if (f == FTALKING) {
|
if (f == FTALKING) {
|
||||||
@ -404,7 +406,7 @@ parse_args(char **argv,
|
|||||||
(argv[go.optind][0] == '-' || argv[go.optind][0] == '+') &&
|
(argv[go.optind][0] == '-' || argv[go.optind][0] == '+') &&
|
||||||
argv[go.optind][1] == '\0') {
|
argv[go.optind][1] == '\0') {
|
||||||
/* lone - clears -v and -x flags */
|
/* lone - clears -v and -x flags */
|
||||||
if (argv[go.optind][0] == '-' && !Flag(FPOSIX))
|
if (argv[go.optind][0] == '-')
|
||||||
Flag(FVERBOSE) = Flag(FXTRACE) = 0;
|
Flag(FVERBOSE) = Flag(FXTRACE) = 0;
|
||||||
/* set skips lone - or + option */
|
/* set skips lone - or + option */
|
||||||
go.optind++;
|
go.optind++;
|
||||||
|
177
mksh.1
177
mksh.1
@ -1,4 +1,4 @@
|
|||||||
.\" $MirOS: src/bin/mksh/mksh.1,v 1.11 2005/07/04 12:07:40 tg Exp $
|
.\" $MirOS: src/bin/mksh/mksh.1,v 1.12 2005/07/04 12:27:27 tg Exp $
|
||||||
.\" $OpenBSD: ksh.1,v 1.99 2005/05/25 16:52:06 jaredy Exp $
|
.\" $OpenBSD: ksh.1,v 1.99 2005/05/25 16:52:06 jaredy Exp $
|
||||||
.\" $OpenBSD: sh.1tbl,v 1.53 2004/12/10 01:56:56 jaredy Exp $
|
.\" $OpenBSD: sh.1tbl,v 1.53 2004/12/10 01:56:56 jaredy Exp $
|
||||||
.\"
|
.\"
|
||||||
@ -810,12 +810,6 @@ the
|
|||||||
and the newline are stripped; otherwise, both the
|
and the newline are stripped; otherwise, both the
|
||||||
.Ql \e
|
.Ql \e
|
||||||
and the character following are unchanged.
|
and the character following are unchanged.
|
||||||
.Pp
|
|
||||||
.Sy Note :
|
|
||||||
See
|
|
||||||
.Sx POSIX mode
|
|
||||||
below for a special rule regarding
|
|
||||||
differences in quoting when the shell is in POSIX mode.
|
|
||||||
.Ss Aliases
|
.Ss Aliases
|
||||||
There are two types of aliases: normal command aliases and tracked aliases.
|
There are two types of aliases: normal command aliases and tracked aliases.
|
||||||
Command aliases are normally used as a short hand for a long or often used
|
Command aliases are normally used as a short hand for a long or often used
|
||||||
@ -2269,168 +2263,6 @@ trapped) will have their default effect in a function.
|
|||||||
The EXIT trap, if set in a function, will be executed after the function
|
The EXIT trap, if set in a function, will be executed after the function
|
||||||
returns.
|
returns.
|
||||||
.El
|
.El
|
||||||
.Ss POSIX mode
|
|
||||||
The shell is intended to be POSIX compliant;
|
|
||||||
however, in some cases, POSIX behaviour is contrary either to
|
|
||||||
the original Korn shell behaviour or to user convenience.
|
|
||||||
How the shell behaves in these cases is determined by the state of the
|
|
||||||
.Ic posix
|
|
||||||
option
|
|
||||||
.Pq Ic set -o posix .
|
|
||||||
If it is on, the POSIX behaviour is followed; otherwise, it is not.
|
|
||||||
.Pp
|
|
||||||
The following is a list of things that are affected by the state of the
|
|
||||||
.Ic posix
|
|
||||||
option:
|
|
||||||
.Bl -bullet
|
|
||||||
.It
|
|
||||||
Reading of
|
|
||||||
.Ev $ENV .
|
|
||||||
If not in
|
|
||||||
.Ic posix
|
|
||||||
mode, the
|
|
||||||
.Ev ENV
|
|
||||||
parameter is not expanded and included when the shell starts.
|
|
||||||
.It
|
|
||||||
Occurrences of
|
|
||||||
.Ic \e\&"
|
|
||||||
inside double quoted
|
|
||||||
.Ic `..`
|
|
||||||
command substitutions.
|
|
||||||
In POSIX mode, the
|
|
||||||
.Ic \e\&"
|
|
||||||
is interpreted when the command is interpreted;
|
|
||||||
in non-POSIX mode,
|
|
||||||
the backslash is stripped before the command substitution is interpreted.
|
|
||||||
For example,
|
|
||||||
.Ic echo \&"`echo \e\&"hi\e\&"`\&"
|
|
||||||
produces
|
|
||||||
.Dq \&"hi\&"
|
|
||||||
in POSIX mode,
|
|
||||||
.Dq hi
|
|
||||||
in non-POSIX mode.
|
|
||||||
To avoid problems, use the
|
|
||||||
.Ic $(...)\&
|
|
||||||
form of command substitution.
|
|
||||||
.It
|
|
||||||
.Ic kill -l
|
|
||||||
output.
|
|
||||||
In POSIX mode, only signal names are listed (in a single line);
|
|
||||||
in non-POSIX mode,
|
|
||||||
signal numbers, names, and descriptions are printed (in columns).
|
|
||||||
In the future, a new option
|
|
||||||
.Pq Fl v No perhaps
|
|
||||||
will be added to distinguish the two behaviours.
|
|
||||||
.It
|
|
||||||
.Ic fg
|
|
||||||
exit status.
|
|
||||||
In POSIX mode, the exit status is 0 if no errors occur;
|
|
||||||
in non-POSIX mode, the exit status is that of the last foregrounded job.
|
|
||||||
.It
|
|
||||||
.Ic eval
|
|
||||||
exit status.
|
|
||||||
If
|
|
||||||
.Ic eval
|
|
||||||
gets to see an empty command (i.e.\&
|
|
||||||
.Ic eval `false` ) ,
|
|
||||||
its exit status in POSIX mode will be 0.
|
|
||||||
In non-POSIX mode,
|
|
||||||
it will be the exit status of the last command substitution that was
|
|
||||||
done in the processing of the arguments to
|
|
||||||
.Ic eval
|
|
||||||
(or 0 if there were no command substitutions).
|
|
||||||
.It
|
|
||||||
.Ic getopts .
|
|
||||||
In POSIX mode, options must start with a
|
|
||||||
.Ql - ;
|
|
||||||
in non-POSIX mode, options can start with either
|
|
||||||
.Ql -
|
|
||||||
or
|
|
||||||
.Ql + .
|
|
||||||
.It
|
|
||||||
Brace expansion (also known as alternation).
|
|
||||||
In POSIX mode, brace expansion is disabled;
|
|
||||||
in non-POSIX mode, brace expansion is enabled.
|
|
||||||
Note that
|
|
||||||
.Ic set -o posix
|
|
||||||
automatically turns the
|
|
||||||
.Ic braceexpand
|
|
||||||
option off; however, it can be explicitly turned on later.
|
|
||||||
.It
|
|
||||||
.Ic set - .
|
|
||||||
In POSIX mode, this does not clear the
|
|
||||||
.Ic verbose
|
|
||||||
or
|
|
||||||
.Ic xtrace
|
|
||||||
options; in non-POSIX mode, it does.
|
|
||||||
.It
|
|
||||||
.Ic set
|
|
||||||
exit status.
|
|
||||||
In POSIX mode, the exit status of
|
|
||||||
.Ic set
|
|
||||||
is 0 if there are no errors;
|
|
||||||
in non-POSIX mode, the exit status is that of any
|
|
||||||
command substitutions performed in generating the
|
|
||||||
.Ic set
|
|
||||||
command.
|
|
||||||
For example,
|
|
||||||
.Ic set -- `false`; echo $?\&
|
|
||||||
prints 0 in POSIX mode, 1 in non-POSIX mode.
|
|
||||||
This construct is used in most shell scripts that use the old
|
|
||||||
.Xr getopt 1
|
|
||||||
command.
|
|
||||||
.It
|
|
||||||
Argument expansion of the
|
|
||||||
.Ic alias ,
|
|
||||||
.Ic export ,
|
|
||||||
.Ic readonly ,
|
|
||||||
and
|
|
||||||
.Ic typeset
|
|
||||||
commands.
|
|
||||||
In POSIX mode, normal argument expansion is done; in non-POSIX mode,
|
|
||||||
field splitting, file globbing, brace expansion, and (normal) tilde expansion
|
|
||||||
are turned off, while assignment tilde expansion is turned on.
|
|
||||||
.It
|
|
||||||
Signal specification.
|
|
||||||
In POSIX mode, signals can be specified as digits, only
|
|
||||||
if signal numbers match POSIX values
|
|
||||||
(i.e. HUP=1, INT=2, QUIT=3, ABRT=6, KILL=9, ALRM=14, and TERM=15);
|
|
||||||
in non-POSIX mode, signals can always be digits.
|
|
||||||
.It
|
|
||||||
Alias expansion.
|
|
||||||
In POSIX mode, alias expansion is only carried out when reading command words;
|
|
||||||
in non-POSIX mode, alias expansion is carried out on any
|
|
||||||
word following an alias that ended in a space.
|
|
||||||
For example, the following
|
|
||||||
.Ic for
|
|
||||||
loop uses parameter
|
|
||||||
.Sq i
|
|
||||||
in POSIX mode and
|
|
||||||
.Sq j
|
|
||||||
in non-POSIX mode:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
alias a='for ' i='j'
|
|
||||||
a i in 1 2; do echo i=$i j=$j; done
|
|
||||||
.Ed
|
|
||||||
.Pp
|
|
||||||
.It
|
|
||||||
.Ic test .
|
|
||||||
In POSIX mode, the expression
|
|
||||||
.Sq Fl t
|
|
||||||
(preceded by some number of
|
|
||||||
.Sq \&!
|
|
||||||
arguments) is always true as it is a non-zero length string;
|
|
||||||
in non-POSIX mode, it tests if file descriptor 1 is a
|
|
||||||
.Xr tty 4
|
|
||||||
(i.e. the
|
|
||||||
.Ar fd
|
|
||||||
argument to the
|
|
||||||
.Fl t
|
|
||||||
test may be left out and defaults to 1).
|
|
||||||
.It
|
|
||||||
Tilde expansion after equal signs (not assignments) is disabled,
|
|
||||||
although not strictly forbidden by POSIX, for consistency with other shells.
|
|
||||||
.El
|
|
||||||
.Ss Strict Bourne shell mode
|
.Ss Strict Bourne shell mode
|
||||||
When the
|
When the
|
||||||
.Ic sh
|
.Ic sh
|
||||||
@ -3414,6 +3246,8 @@ the value of
|
|||||||
Background jobs are run with lower priority.
|
Background jobs are run with lower priority.
|
||||||
.It Ic braceexpand
|
.It Ic braceexpand
|
||||||
Enable brace expansion (a.k.a. alternation).
|
Enable brace expansion (a.k.a. alternation).
|
||||||
|
This is enabled by default.
|
||||||
|
If disabled, tilde expansion after an equals sign is disabled as a side effect.
|
||||||
.It Ic emacs
|
.It Ic emacs
|
||||||
Enable BRL emacs-like command-line editing (interactive shells only); see
|
Enable BRL emacs-like command-line editing (interactive shells only); see
|
||||||
.Sx Emacs editing mode .
|
.Sx Emacs editing mode .
|
||||||
@ -3478,11 +3312,6 @@ See the
|
|||||||
and
|
and
|
||||||
.Ic pwd
|
.Ic pwd
|
||||||
commands above for more details.
|
commands above for more details.
|
||||||
.It Ic posix
|
|
||||||
Enable POSIX mode.
|
|
||||||
See
|
|
||||||
.Sx POSIX mode
|
|
||||||
above.
|
|
||||||
.It Ic restricted
|
.It Ic restricted
|
||||||
The shell is a restricted shell.
|
The shell is a restricted shell.
|
||||||
This option can only be used when the shell is invoked.
|
This option can only be used when the shell is invoked.
|
||||||
|
6
syn.c
6
syn.c
@ -1,9 +1,9 @@
|
|||||||
/** $MirOS: src/bin/mksh/syn.c,v 1.1 2005/05/23 03:06:10 tg Exp $ */
|
/** $MirOS: src/bin/mksh/syn.c,v 1.2 2005/07/04 12:27:28 tg Exp $ */
|
||||||
/* $OpenBSD: syn.c,v 1.22 2005/03/30 17:16:37 deraadt Exp $ */
|
/* $OpenBSD: syn.c,v 1.22 2005/03/30 17:16:37 deraadt Exp $ */
|
||||||
|
|
||||||
#include "sh.h"
|
#include "sh.h"
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/syn.c,v 1.1 2005/05/23 03:06:10 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/syn.c,v 1.2 2005/07/04 12:27:28 tg Exp $");
|
||||||
|
|
||||||
struct nesting_state {
|
struct nesting_state {
|
||||||
int start_token; /* token than began nesting (eg, FOR) */
|
int start_token; /* token than began nesting (eg, FOR) */
|
||||||
@ -778,7 +778,7 @@ assign_command(char *s)
|
|||||||
{
|
{
|
||||||
char c = *s;
|
char c = *s;
|
||||||
|
|
||||||
if (Flag(FPOSIX) || !*s)
|
if (!*s)
|
||||||
return 0;
|
return 0;
|
||||||
return (c == 'a' && strcmp(s, "alias") == 0) ||
|
return (c == 'a' && strcmp(s, "alias") == 0) ||
|
||||||
(c == 'e' && strcmp(s, "export") == 0) ||
|
(c == 'e' && strcmp(s, "export") == 0) ||
|
||||||
|
Reference in New Issue
Block a user