summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <p.stephenson@samsung.com>2019-12-12 10:47:00 +0000
committerPeter Stephenson <p.stephenson@samsung.com>2019-12-12 10:47:00 +0000
commitcb4dc956439140ca595b2b7dfd511efaa22d1e22 (patch)
tree570c922210981e141d0082de55f9147cb43387f4
parent273d669a568ed9ee705916e42945f4239501cdcb (diff)
downloadzsh-cb4dc956439140ca595b2b7dfd511efaa22d1e22.tar.gz
zsh-cb4dc956439140ca595b2b7dfd511efaa22d1e22.tar.xz
zsh-cb4dc956439140ca595b2b7dfd511efaa22d1e22.zip
45009: POSIX_CD needs to suppress some forms of option.
Otherwise forms of argument allowed by POSIX are interpreted as
options instead.
-rw-r--r--Doc/Zsh/builtins.yo2
-rw-r--r--Doc/Zsh/options.yo3
-rw-r--r--Src/builtin.c2
3 files changed, 5 insertions, 2 deletions
diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo
index 15d3e0cf4..415bce613 100644
--- a/Doc/Zsh/builtins.yo
+++ b/Doc/Zsh/builtins.yo
@@ -290,6 +290,8 @@ of the list shown by the tt(dirs) command, starting with zero.
 An argument of the form `tt(-)var(n)' counts from the right.
 If the tt(PUSHD_MINUS) option is set, the meanings of `tt(PLUS())'
 and `tt(-)' in this context are swapped.
+If the tt(POSIX_CD) option is set, this form of tt(cd) is not recognised
+and will be interpreted as the first form.
 
 If the tt(-q) (quiet) option is specified, the hook function tt(chpwd)
 and the functions in the array tt(chpwd_functions) are not called.
diff --git a/Doc/Zsh/options.yo b/Doc/Zsh/options.yo
index 903c31134..88bb643d1 100644
--- a/Doc/Zsh/options.yo
+++ b/Doc/Zsh/options.yo
@@ -148,7 +148,8 @@ ifzman(zmanref(zshbuiltins))\
 ifnzman(noderef(Shell Builtin Commands)).
 If the option is set, the shell does not test for directories beneath
 the local directory (`tt(.)') until after all directories in tt(cdpath)
-have been tested.
+have been tested, and the tt(cd) and tt(chdir) commands do not recognise
+arguments of the form `{tt(PLUS())|tt(-)}var(n)' as directory stack entries.
 
 Also, if the option is set, the conditions under which the shell
 prints the new directory after changing to it are modified.  It is
diff --git a/Src/builtin.c b/Src/builtin.c
index bd7736d2c..7bf4281da 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -912,7 +912,7 @@ cd_get_dest(char *nam, char **argv, int hard, int func)
 	char *end;
 
 	doprintdir++;
-	if (argv[0][1] && (argv[0][0] == '+' || argv[0][0] == '-')
+	if (!isset(POSIXCD) && argv[0][1] && (argv[0][0] == '+' || argv[0][0] == '-')
 	    && strspn(argv[0]+1, "0123456789") == strlen(argv[0]+1)) {
 	    dd = zstrtol(argv[0] + 1, &end, 10);
 	    if (*end == '\0') {