- 如何获取任何目录的完整文件名?
- 文件路径是否也应该没有任何根目录?
答案1
POSIXly,要获取目录的无符号链接绝对路径,其中存储的路径(可能相对于当前目录,可能带有符号链接)存储在 中$dir
,前提是您有搜索对该目录的权限,你可以这样做
(
case $dir in
(/*) CDPATH= cd -P "$dir";;
("") CDPATH= cd -P "";;
(*) CDPATH= cd -P "./$dir";;
esac && pwd -P
)
这里逐字复制自该文本将包含在 POSIX 规范的下一版本中。
如此处所述,对于这种""
情况,您可能希望输出错误,而不是依赖当前未指定的行为cd
或编写它:
(
case "${dir:?directory cannot be empty}" in
(/*) CDPATH= cd -P "$dir";;
(*) CDPATH= cd -P "./$dir";;
esac && pwd -P
)
请注意,当不是绝对时,前缀$dir
with./
并不是为了$dir
在它开头时不被视为一个选项-
(这就CDPATH= cd -P -- "${dir:?cannot be empty}"
足够了),而是为了特殊值-
,而不是cd
解释为表示$OLDPWD
、上一个工作目录(并且CDPATH= OLDPWD=- cd -P -- "${dir:?cannot be empty}"
不能便携式地用来解决这个问题)。
一种情况是目录当它是当前目录并且已与其父目录取消链接时,不能有绝对路径:
$ mkdir 1
$ cd 1
$ rmdir ../1
$ cd -P .
$ ls -ld .
drwxr-xr-x 0 chazelas chazelas 0 Mar 27 06:53 ./
$ [ -d . ] && echo yes
yes
仍然存在,但是:
$ pwd -P
.
$ realpath .
realpath: .: No such file or directory
$ readlink -ve .
readlink: .: No such file or directory
它在文件系统上没有路径。
这没有这样的文件或目录error 有点误导,因为.
目录确实存在(尽管人们不能用它做太多事情),但至少在 Linux 上,getcwd()
返回一个ENOENT
errno 表示当前目录已取消链接。
答案2
相对路径不包含根目录,因为它们是相对于当前目录的。
例子:
development/project/src
src
这是当前目录下称为两级目录的相对路径。路径没有说明它src
是目录名、文件名还是其他名称。
在 Linux 系统上,您可以使用该realpath
实用程序来获取名称的完整(绝对)路径:
$ realpath development/project/src
/home/myuser/work/development/project/src
绝对路径始终以根目录开头。更准确地说,它从当前进程的根目录开始,可以使用命令更改该根目录chroot
。
在大多数 Unix 系统上,您可以在从当前目录开始的相对路径前加上前缀来$PWD
获取绝对路径:
$ printf '%s\n' "$PWD/development/project/src"
/home/myuser/work/development/project/src
然而,这只是一个字符串连接,并不能以与解析路径完全相同的方式解析路径realpath
。如果给定的相对路径正确,它将给出一个功能性的绝对路径。