Fluffy Asked: 2022-04-01 11:04:58 +0800 CST2022-04-01 11:04:58 +0800 CST 2022-04-01 11:04:58 +0800 CST 递归显示相对于当前目录的所有父目录 772 递归显示相对于当前目录的所有父目录。 #!/bin/bash IFS=/ for var in $(pwd) do echo "$var" done bash pwd 1 个回答 Voted Best Answer Stéphane Chazelas 2022-04-01T12:02:58+08:002022-04-01T12:02:58+08:00 您可以执行以下操作: ( 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。您确实通过设置为配置了拆分部分,但忘记禁用 glob 部分(使用)。如果是一个名为 的目录,则该目录将被拆分为“”、“tmp”以及当前目录中的所有非隐藏文件。$PWDinfor$IFS/set -o noglob$PWD/tmp/* echo不能用于输出任意数据。该方式bash通常是在一个名为/tmp/-Ene的目录中构建和配置的,echo -Ene不会输出任何内容。要输出后跟换行符的内容,请printf '%s\n' "$var"改用。 即使在 a$PWD的/path/to/dir任何组件都不是符号链接的直接情况下,您的代码也会输出一个空行,path,to并且dir它们都不是当前目录的祖先目录,/而是/path, /path/to。
您可以执行以下操作:
然而,至少存在一种代码可能在无限循环中运行的病态情况:当当前目录已被删除时。在这种情况下,我发现至少在 GNU/Linux 和 bash-5.0 上,当 bash 它不是交互式时,会
cd -P ..
输出错误但不会返回失败退出状态。然后,$PWD
变成.
和后续cd -P ..
的什么都不做。更改循环退出条件以[ "$PWD" != / ] && [ "$PWD" != . ] && cd -P ..
解决那里的问题。关于您的方法的一些评论:
$(pwd)
扩展为pwd
减去尾随换行符的输出,因此如果当前目录以换行符结尾,它将无法正常工作。$PWD
保存了当前工作目录的路径,这就是pwd
打印的内容。但是请注意,除非您使用到达那里cd
的选项,否则存储的路径和输出可能包含符号链接组件。如果是并且该文件是符号链接,则其父目录可能不是.-P
$PWD
pwd
$PWD
/foo/bar/baz
/foo/bar
bash
,在列表上下文中(例如在该循环语句的部分中)不加引号$(pwd)
(或)调用 split+glob。您确实通过设置为配置了拆分部分,但忘记禁用 glob 部分(使用)。如果是一个名为 的目录,则该目录将被拆分为“”、“tmp”以及当前目录中的所有非隐藏文件。$PWD
in
for
$IFS
/
set -o noglob
$PWD
/tmp/*
echo
不能用于输出任意数据。该方式bash
通常是在一个名为/tmp/-Ene
的目录中构建和配置的,echo -Ene
不会输出任何内容。要输出后跟换行符的内容,请printf '%s\n' "$var"
改用。$PWD
的/path/to/dir
任何组件都不是符号链接的直接情况下,您的代码也会输出一个空行,path
,to
并且dir
它们都不是当前目录的祖先目录,/
而是/path
,/path/to
。