在 Linux 中如何强制将相对变为绝对?

在 Linux 中如何强制将相对变为绝对?

我有一个第三方软件,它具有外部配置,以“文件路径”作为输入参数。不幸的是,该软件将给定的路径与一些预定义路径连接起来。例如,它期望“data/images”作为参数,并将使用“/Users/someuser/work/source/data/images”。我想指定绝对路径,但给这个软件提供类似“/tmp/images”的东西只会导致使用不存在的路径“/Users/someuser/work/source//tmp/images”:(。我是否可以将“..”与“路径技巧”一起使用,这样我就可以为软件提供something在将其与预定义路径连接后产生绝对路径的软件。使用“..”有效,但这不是一个很好的解决方案,因为路径配置是静态的,而预定义路径软件的使用可能会发生变化。

答案1

在 Linux 中,有无数种方式可以/Users/someuser/work/source/XXX指向您想要的任何地方:

  • 使用符号链接-执行以下操作:

    ln -s /wherever/you/want /Users/someuser/work/source/XXX
    

    会使其/Users/someuser/work/source/XXX看起来像一个目录。如果某些软件会前往该目录和/或将文件写入该目录,则它们最终会进入/wherever/you/want

  • 挂载其他文件系统XXX,例如

    mount /dev/something /Users/someuser/work/source/XXX
    

    这样,您就可以将 /dev/something 设备直接安装在应用程序要写入的目录中。

  • 执行“绑定挂载”,即将其他文件系统的一部分(已挂载)重新绑定到XXX

    mount -o bind /wherever/you/want /Users/someuser/work/source/XXX
    

    它的工作方式与符号链接非常相​​似,但应用程序很难检测到它。应用程序可能会轻松检查目标目录是否为符号链接并拒绝写入,而绑定安装方法提供了一个普通目录,但其内容将

  • 使用类似 unionfs 的文件系统,例如联合文件系统或者奥夫斯- 这样你就可以“统一”,即在一个目录中同时挂载多个文件系统(即XXX

  • 使用 LD_PRELOAD 和覆盖方法的库(例如open()fopen()等)的一些技巧 - 最突出的是保险丝,也就是说,你可能想看看FUSE 的类似 Union 的文件系统

答案2

如果你符号链接/Users/someuser/work/source//(root)

work$ ln -s / source

那里的每一条路径都基于根:

/Users/someuser/work/source/tmp/images 

将指向

/tmp/images

您可以通过以下方式检查

work$ ls source/tmp/images

相关内容