about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBart Schaefer <schaefer@ipost.com>2021-04-18 14:26:12 -0700
committerBart Schaefer <schaefer@ipost.com>2021-04-18 14:26:12 -0700
commit71b747567e350c5f849897c424ea76fd05b34ffe (patch)
tree71ac096df68a13309adf4abffcd6a31ebcc67200
parent82ff9f24f170eea7daa935fdaa09ab75a2f277ff (diff)
downloadzsh-71b747567e350c5f849897c424ea76fd05b34ffe.tar.gz
zsh-71b747567e350c5f849897c424ea76fd05b34ffe.tar.xz
zsh-71b747567e350c5f849897c424ea76fd05b34ffe.zip
47704: POSIX export and readonly ignore "-p" when parameter names also appear
-rw-r--r--ChangeLog4
-rw-r--r--Src/builtin.c8
-rw-r--r--Src/params.c4
-rw-r--r--Test/B02typeset.ztst8
4 files changed, 17 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 7dcbbc533..c450afd05 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2021-04-18  Bart Schaefer  <schaefer@zsh.org>
 
+	* 47704: Src/builtin.c, Src/params.c, Test/B02typeset.ztst:
+	POSIX export and readonly ignore the "-p" option when parameter
+	names are also present.
+
 	* 48560: Completion/compinit, Doc/Zsh/builtins.yo,
 	Doc/Zsh/options.yo, Doc/Zsh/params.yo, Src/builtin.c,
 	Src/options.c, Src/params.c, Src/subst.c, Src/zsh.h,
diff --git a/Src/builtin.c b/Src/builtin.c
index 6d119f7a5..efa20607e 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -2615,7 +2615,12 @@ bin_typeset(char *name, char **argv, LinkList assigns, Options ops, int func)
     int on = 0, off = 0, roff, bit = PM_ARRAY;
     int i;
     int returnval = 0, printflags = 0;
-    int hasargs;
+    int hasargs = *argv != NULL || (assigns && firstnode(assigns));
+
+    /* POSIXBUILTINS is set for bash/ksh and both ignore -p with args */
+    if ((func == BIN_READONLY || func == BIN_EXPORT) &&
+	isset(POSIXBUILTINS) && hasargs)
+	ops->ind['p'] = 0;
 
     /* hash -f is really the builtin `functions' */
     if (OPT_ISSET(ops,'f'))
@@ -2695,7 +2700,6 @@ bin_typeset(char *name, char **argv, LinkList assigns, Options ops, int func)
 	    /* -p0 treated as -p for consistency */
 	}
     }
-    hasargs = *argv != NULL || (assigns && firstnode(assigns));
     if (!hasargs) {
 	int exclude = 0;
 	if (!OPT_ISSET(ops,'p')) {
diff --git a/Src/params.c b/Src/params.c
index 33bbc54f6..20dfb5b5f 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -5883,8 +5883,12 @@ printparamnode(HashNode hn, int printflags)
 	 * don't.
 	 */
 	if (printflags & PRINT_POSIX_EXPORT) {
+	    if (!(p->node.flags & PM_EXPORTED))
+		return;
 	    printf("export ");
 	} else if (printflags & PRINT_POSIX_READONLY) {
+	    if (!(p->node.flags & PM_READONLY))
+		return;
 	    printf("readonly ");
 	} else if (locallevel && p->level >= locallevel) {
 	    printf("typeset ");	    /* printf("local "); */
diff --git a/Test/B02typeset.ztst b/Test/B02typeset.ztst
index e7bf93794..8b3988151 100644
--- a/Test/B02typeset.ztst
+++ b/Test/B02typeset.ztst
@@ -620,7 +620,7 @@
    print ${+pbro} >&2
    (typeset -g pbro=3)
    (pbro=4)
-   readonly -p pbro >&2   # shows up as "readonly" although unset
+   readonly -p >&2        # shows up as "readonly" although unset
    typeset -gr pbro       # idempotent (no error)...
    print ${+pbro} >&2     # ...so still readonly...
    typeset -g +r pbro     # ...can't turn it off
@@ -1050,23 +1050,21 @@
 
  $ZTST_testdir/../Src/zsh --emulate sh -f -c '
  PATH=/bin; export PATH; readonly PATH
- export -p PATH
+ export -p PATH		# Should be a no-op, -p ignored
  typeset -p PATH
  readonly -p'
 0: readonly/export output for exported+readonly+special when started as sh
->export PATH=/bin
 >export -r PATH=/bin
 >readonly PATH=/bin
 
  function {
  emulate -L sh
  MANPATH=/bin; export MANPATH; readonly MANPATH
- export -p MANPATH
+ export -p MANPATH	# Should be a no-op, -p ignored
  typeset -p MANPATH
  readonly -p
  }
 0: readonly/export output for exported+readonly+tied+special after switching to sh emulation
->export MANPATH=/bin
 >export -rT MANPATH manpath=( /bin )
 >readonly MANPATH=/bin