如何在路径名中将".."转换为bash脚本中的绝对名称?

Noh*_*sib 41 unix linux bash

如何..在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 没有.

  • 这是错误的答案.因此,不需要将符号链接解析为实际路径,而是将相对路径扩展为绝对路径,这是不同的事情.假设我在目录中有脚本的数据文件和符号链接,如果你想在使用符号链接的相对路径时解析dir的绝对路径,那么我想访问数据文件,readlink或realpath会失败 (8认同)
  • FWIW,不适用于OSX Mountain Lion. (4认同)
  • 比`cd好多了 pwd`解决方案.值得注意的是,相关的C函数是`realpath(3)`. (2认同)

dim*_*mba 33

尝试:

ABSOLUTE_PATH=$(cd /home/nohsib/dvc/../bop; pwd)
Run Code Online (Sandbox Code Playgroud)

  • @Craig:`ABSOLUTE_PATH = $(CD $(目录名{DIR或文件}); PWD)` (5认同)
  • 我认为这个答案应该是最重要的.有用.它是跨平台的,不同于在OS X上存在问题的readlink解决方案. (4认同)

Gin*_*ino 9

使用的一个问题:

ABSOLUTE_PATH=$(cd ${possibleDirectory}; pwd)

如果$ {possibleDirectory}不存在,那么ABSOLUTE_PATH将被设置为当前目录.这可能不是你想要或期望的.

我认为使用这个版本可能更为可取:

ABSOLUTE_PATH=$(cd ${possibleDirectory} && pwd)

如果$ {possibleDirectory}不存在或无法访问,由于缺少目录访问权限,ABSOLUTE_PATH将包含空字符串.

这样做的好处是,您可以测试空字符串或让它自然失败,具体取决于具体情况.在'cd'命令失败的情况下默认为当前目录可能会导致非常意外且可能是灾难性的结果(例如rm -rf"$ ABSOLUTE_PATH")


Cra*_*een 5

如果您想在不遵循任何符号链接的情况下执行此操作,请尝试使用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开关。)