递归显示相对于当前目录的所有父目录。
#!/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
,否则存储的路径$PWD
和pwd
输出可能包含符号链接组件。如果$PWD
是/foo/bar/baz
并且该文件是符号链接,则其父目录可能不是/foo/bar
. - in 中
bash
,在列表上下文中(例如在该循环语句的部分中)不加引号$(pwd)
(或) ,会调用 split+glob。您确实通过设置为 来配置分割部分,但忘记禁用全局部分(使用)。如果是一个名为 的目录,则该目录将被 split+globbed 为“”、“tmp”以及当前目录中的所有非隐藏文件。$PWD
in
for
$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
。