> +1 and `cd -' has the similar problem. So, I guess there are several cases to consider.
1. CDPATH 2. cdable_vars 3. - 4. cdspell I have attached another patch that would prevent echoing the path in all of these cases with the `-q` option.
--- builtins/cd.def.orig 2014-01-20 16:52:02.000000000 -0700 +++ builtins/cd.def 2014-01-20 20:31:49.000000000 -0700 @@ -92,6 +92,8 @@ links -e if the -P option is supplied, and the current working directory cannot be determined successfully, exit with a non-zero status + -q prevent the working directory from being echoed when DIR + is found using - or CDPATH or spell correction or a variable name The default is to follow symbolic links, as if `-L' were specified. @@ -187,7 +189,7 @@ WORD_LIST *list; { char *dirname, *cdpath, *path, *temp; - int path_index, no_symlinks, opt, lflag; + int path_index, no_symlinks, opt, lflag, qflag; #if defined (RESTRICTED_SHELL) if (restricted) @@ -198,9 +200,10 @@ #endif /* RESTRICTED_SHELL */ eflag = 0; + qflag = 0; no_symlinks = no_symbolic_links; reset_internal_getopt (); - while ((opt = internal_getopt (list, "LP")) != -1) + while ((opt = internal_getopt (list, "LPq")) != -1) { switch (opt) { @@ -213,6 +216,9 @@ case 'e': eflag = 1; break; + case 'q': + qflag = 1; + break; default: builtin_usage (); return (EXECUTION_FAILURE); @@ -250,7 +256,7 @@ #if 0 lflag = interactive ? LCD_PRINTPATH : 0; #else - lflag = LCD_PRINTPATH; /* According to SUSv3 */ + lflag = qflag ? 0 : LCD_PRINTPATH; /* According to SUSv3 */ #endif } else if (absolute_pathname (list->word->word)) @@ -274,7 +280,7 @@ is used to find the directory to change to, the new directory name is echoed to stdout, whether or not the shell is interactive. */ - if (opt && (path = no_symlinks ? temp : the_current_working_directory)) + if (opt && !qflag && (path = no_symlinks ? temp : the_current_working_directory)) printf ("%s\n", path); free (temp); @@ -323,7 +329,8 @@ temp = get_string_value (dirname); if (temp && change_to_directory (temp, no_symlinks)) { - printf ("%s\n", temp); + if (!qflag) + printf ("%s\n", temp); return (bindpwd (no_symlinks)); } } @@ -336,7 +343,8 @@ temp = dirspell (dirname); if (temp && change_to_directory (temp, no_symlinks)) { - printf ("%s\n", temp); + if (!qflag) + printf ("%s\n", temp); return (bindpwd (no_symlinks)); } else