如何..在bash脚本中将路径名转换为绝对路径名.也就是说,如果我有一条路径/home/nohsib/dvc/../bop,我希望在这种情况下将其更改为没有点的路径/home/nohsib/bop
我怎样才能做到这一点?
Mar*_*tin 48
你在寻找的是readlink:
absolute_path=$(readlink -m /home/nohsib/dvc/../bop)
Run Code Online (Sandbox Code Playgroud)
请注意:您需要使用GNU的readlink实现,它提供"-m"选项.readlink例如,BSD 没有.
dim*_*mba 33
尝试:
ABSOLUTE_PATH=$(cd /home/nohsib/dvc/../bop; pwd)
Run Code Online (Sandbox Code Playgroud)
使用的一个问题:
ABSOLUTE_PATH=$(cd ${possibleDirectory}; pwd)
如果$ {possibleDirectory}不存在,那么ABSOLUTE_PATH将被设置为当前目录.这可能不是你想要或期望的.
我认为使用这个版本可能更为可取:
ABSOLUTE_PATH=$(cd ${possibleDirectory} && pwd)
如果$ {possibleDirectory}不存在或无法访问,由于缺少目录访问权限,ABSOLUTE_PATH将包含空字符串.
这样做的好处是,您可以测试空字符串或让它自然失败,具体取决于具体情况.在'cd'命令失败的情况下默认为当前目录可能会导致非常意外且可能是灾难性的结果(例如rm -rf"$ ABSOLUTE_PATH")
如果您想在不遵循任何符号链接的情况下执行此操作,请尝试使用realpathwith 选项-s:
$ realpath -s /home/nohsib/dvc/../bop
/home/nohsib/bop
Run Code Online (Sandbox Code Playgroud)
请注意,对于realpath,通常除了最后一个组件之外的所有组件都必须存在。因此,要使上述工作正常进行,文件系统中必须存在以下内容:
/home
/home/nohsib
/home/nohsib/dvc
Run Code Online (Sandbox Code Playgroud)
但您可以使用该-m选项绕过该要求。
$ realpath -sm /home/nohsib/dvc/../bop
/home/nohsib/bop
Run Code Online (Sandbox Code Playgroud)
(注意realpath并非在所有系统上都可用,尤其是较旧的非 Debian 系统。对于那些使用嵌入式 Linux 的人来说,不幸的是 Busyboxrealpath不支持-s或-m开关。)