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') {