Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH] POSIX_CD: disable stack entries

Recognising directory stack entries for the 'cd' builtin is not compatible with POSIX, because cd'ing into directories with names like +123 or -4567 no longer works without prefixing './', even after '--'. In POSIX, only the '-' operand has such a special meaning. The attached patch disables directory stack entries for 'cd' if POSIX_CD is active.

This patch also changes the behaviour of the 'chdir' equivalent. For POSIX compliance, only 'cd' needs to be changed, as POSIX has no 'chdir'. I could change the patch to only change 'cd', but it would involve slightly more code, and would make 'cd' and 'chdir' no longer exactly equivalent. If this is preferred, please let me know.


- M.

modernish -- harness the shell
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;
-	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') {

Messages sorted by: Reverse Date, Date, Thread, Author