在 bash 中一起使用 autocd 和 CDPATH 吗?

osp*_*alh 5 bash cd-command

在 bash 中,是否有一种方法可以组合autocdCDPATH,即转到元素的子目录而无需在目录名称之前CDPATH输入?cd

\n\n

例如,如果我有这些目录:

\n\n
    \n
  • \n
  • 〜/留特
  • \n
  • 〜/洛特/欣茨
  • \n
  • 〜/洛特/昆兹
  • \n
  • 〜/丁格
  • \n
  • 〜/丁格/豪斯
  • \n
  • 〜/丁格/自动
  • \n
\n\n

并做

\n\n
~$ shopt -s autocd\n~$ export CDPATH=":~/Leute:~/Dinge"\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么我可以做

\n\n
~$ Leute\n
Run Code Online (Sandbox Code Playgroud)\n\n

并最终进入 ~/Leute 目录(就是这样autocd

\n\n
~/Leute$\n
Run Code Online (Sandbox Code Playgroud)\n\n

我可以做

\n\n
~/Leute$ cd Auto\n
Run Code Online (Sandbox Code Playgroud)\n\n

最终进入 ~/Dinge/Auto (那个CDPATH东西)

\n\n
~/Dinge/Auto$\n
Run Code Online (Sandbox Code Playgroud)\n\n

但将两者结合起来似乎不起作用。\n例如,从 ~/Leute 开始,我可以\xe2\x80\x99t 跳转到 ~/Dinge/Auto 而无需显式cd

\n\n
~/Leute$ Auto\nbash: Auto: Command not found...\n
Run Code Online (Sandbox Code Playgroud)\n\n

是否有一个原因?或者还需要其他东西才能使这项工作正常进行吗?

\n

Tob*_*ght 3

无论是出于设计还是疏忽,似乎对您是否键入目录名称的测试都不会搜索变量CDPATH

execute.cmd.c, 功能execute_simple_command

  if (autocd && interactive && words->word && is_dirname (words->word->word))
    {
      words = make_word_list (make_word ("cd"), words);
      xtrace_print_word_list (words, 0);
      goto run_builtin;
    }
Run Code Online (Sandbox Code Playgroud)

的定义is_dirname在同一个源文件中:

/* Return 1 if the file found by searching $PATH for PATHNAME, defaulting
   to PATHNAME, is a directory.  Used by the autocd code below. */
static int
is_dirname (pathname)
     char *pathname;
{
  char *temp;
  int ret;

  temp = search_for_command (pathname, 0);
  ret = (temp ? file_isdir (temp) : file_isdir (pathname));
  free (temp);
  return ret;
}
Run Code Online (Sandbox Code Playgroud)

由此看来,似乎autocd会在 上找到目录PATH,但我用X11(for /usr/bin/X11/) 对其进行了测试并得到了错误X11: No such file or directory