为什么 bash 完成符号链接与目录不同?

Mr.*_*nce 6 find utilities symlink

我通常find在搜索源代码时使用环境变量作为路径。最近我用符号链接替换了我的环境变量,它破坏了 Bash 的 shell 完成。当我find使用符号链接时,它不起作用,但如果我使用符号链接指向的实际路径,它会找到。

ln -s /some/source/dir /the/source
export SYMLINK=/the/source
export DIR=/some/source/dir

find $SYMLINK -name file.c        // doesn't find anything
find $DIR -name file.c            // works as expected
Run Code Online (Sandbox Code Playgroud)

在此示例中,$SYMLINK 是 $DIR 值的符号链接。

那么,为什么 bash 以不同的方式处理符号链接环境变量?

Gil*_*il' 7

这不是 bash,而是 find;尽管您会发现大多数实用程序都遵循相同的原则:

  • 如果对文件内容进行操作,则指向常规文件的符号链接等效于实际文件。
  • 如果操作目录条目,符号链接是它们自己的类别。

当您运行时find $SYMLINK,会find看到一个不是目录的对象,因此它不会遍历它。如果要将指向目录的符号链接视为该目录,请/在末尾添加 a (一些损坏的系统或命令可能需要"$SYMLINK/."):

find "$SYMLINK/" -name file.c
Run Code Online (Sandbox Code Playgroud)

对于find,您还可以使用该-H选项,该选项告诉它将命令行上的任何符号链接视为您已指定目标:

find -H "$SYMLINK" -name file.c
Run Code Online (Sandbox Code Playgroud)