递归显示相对于当前目录的所有父目录

递归显示相对于当前目录的所有父目录

递归显示相对于当前目录的所有父目录。

#!/bin/bash
IFS=/
for var in $(pwd)
do
echo "$var"
done

答案1

你可以这样做:

(
  while
    [ "$PWD" != / ] && cd -P ..
  do
    pwd
  done
)

然而,至少存在一种病态情况,即该代码可能无限循环运行:当当前目录已被删除时。在这种情况下,我发现在 GNU/Linux 上并且至少在 bash-5.0 上,当 bash 不交互式时,cd -P ..会输出错误但不会返回失败退出状态。然后,$PWD变得.和后续的cd -P ..什么都不做。更改循环退出条件以 [ "$PWD" != / ] && [ "$PWD" != . ] && cd -P .. 解决该问题。

关于您的方法的一些评论:

  • $(pwd)pwd扩展为减去尾随换行符的输出,因此如果当前目录以换行符结尾,则它无法正常工作。
  • 在 POSIX shell 中,$PWD保存着当前工作目录的路径,这就是pwd打印的内容。但请注意,除非您使用到达那里的cd选项-P,否则存储的路径$PWDpwd输出可能包含符号链接组件。如果$PWD/foo/bar/baz并且该文件是符号链接,则其父目录可能不是/foo/bar.
  • in 中bash,在列表上下文中(例如在该循环语句的部分中)不加引号$(pwd)(或) ,会调用 split+glob。您确实通过设置为 来配置分割部分,但忘记禁用全局部分(使用)。如果是一个名为 的目录,则该目录将被 split+globbed 为“”、“tmp”以及当前目录中的所有非隐藏文件。$PWDinfor$IFS/set -o noglob$PWD/tmp/*
  • echo不能用于输出任意数据。该方法bash通常是在名为 的目录中构建和配置的,/tmp/-Ene不会echo -Ene输出任何内容。要输出后跟换行符的内容,请改用printf '%s\n' "$var"
  • $PWD即使在 a 的任何组件都不是符号链接的直接情况下/path/to/dir,您的代码也会输出一个空行 ,path并且to其中dir没有一个是当前目录的祖先目录/,而是 ,/path/path/to

相关内容