如何在 Bash Shell 中评估给定路径。

8
有没有一个bash命令可以将文件路径作为输入,并返回绝对文件路径? 更具体地说,我想要一个可以将路径作为输入的命令,例如:
/tmp/yaneeve/kit/linux/../../output/kit/SOURCES//usr//apps/myapp/lib

并返回路径:

/tmp/yaneeve/output/kit/SOURCES/usr/apps/myapp/lib
3个回答

17

如果路径存在,有一种不受操作系统限制的可移植方法(即使在Linux上也是如此),它更加可靠:

canonicalPath=$(cd "$path"; pwd)

很好,有必要使用外部pwd程序吗?内部程序遵循逻辑路径,不需要与“物理”路径匹配。 - TheBonsai
创建名为“ dir1”的文件夹,创建指向它的链接“ dir2”,进入“ dir2”,比较当前工作目录和命令pwd。 - TheBonsai

6
尝试(Linux)
readlink -f

大家好,请注意,我发现了readlink的一个问题(?)。当路径实际不存在时,它仅将第一部分附加到其输出中。例如:假设输入是/tmp/yaneeve/apps/newapp/guide/eng并且假设此路径的最深部分存在于 /tmp/yaneeve/apps 中,则输出将为 /tmp/yaneeve/apps/newapp对此有何评论? - Yaneeve
这里对于不存在的路径没有输出任何内容(我使用了您的示例)。 - TheBonsai
请注意,readlink -f 是一个物理路径评估命令。路径中的所有符号链接都会从左到右解析。这往往会产生令人惊讶的结果,因为并不总是清楚哪个文件夹是一个符号链接(我猜你也不想知道)。如果你想评估逻辑路径,可以使用 realpath -L 或者 $(cd "$path"; pwd) 的解决方案。这两种方法都进行逻辑评估,并且不解析符号链接。 - immerzl

1
你也可以使用`realpath`,如果路径存在的话:
realpath /tmp/yaneeve/kit/linux/../../output/kit/SOURCES/usr/apps/myapp/lib

给出:

/tmp/yaneeve/output/kit/SOURCES/usr/apps/myapp/lib

来自man page

realpath - 返回规范化的绝对路径名


OP问到了绝对路径,并没有提到这是逻辑路径还是物理路径的评估。大多数用户期望进行逻辑评估,所以在这种情况下,您需要添加-L选项。 - immerzl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接