Linux で相対パスを絶対パスに強制するにはどうすればよいでしょうか?

Linux で相対パスを絶対パスに強制するにはどうすればよいでしょうか?

外部構成を持つサードパーティのソフトウェアがあり、入力パラメータとして「ファイルへのパス」を受け取ります。残念ながら、このソフトウェアは指定されたパスを何らかの定義済みパスと連結します。たとえば、パラメータとして「data/images」を想定し、「/Users/someuser/work/source/data/images」を使用します。絶対パスを指定したいのですが、このソフトウェアに「/tmp/images」のようなものを指定すると、存在しないパス「/Users/someuser/work/source//tmp/images」が使用されることになります。これは、「..」と一緒に使用できるパストリックであり、ソフトウェアがsomethingそれを定義済みパスと連結した後に絶対パスになるソフトウェアを提供できます。「..」を使用すると機能しますが、パス構成は静的であり、定義済みパスソフトウェアの使用は変更される可能性があるため、あまり良い解決策ではありません。

答え1

/Users/someuser/work/source/XXXLinux では、任意の場所を指すようにするための無数の可能性があります。

  • シンボリックリンクを使用する - 次のようにします:

    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のようなファイルシステムを使用する。ユニオンまたはアウフス- この方法では、複数のファイルシステムを 1 つのディレクトリに同時にマウントするなど、「統合」することができます (つまり、XXX)

  • open()LD_PRELOADや、、などのメソッドをオーバーライドするライブラリを使ってトリックを試してみてください。fopen()最も有名なのはヒューズつまり、次のことをチェックしてみてくださいFUSE 用の Union のようなファイルシステム

答え2

(ルート)/Users/someuser/work/source/にシンボリックリンクする場合/

work$ ln -s / source

そこにあるすべてのパスはルートに基づきます:

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

指し示す

/tmp/images

確認するには

work$ ls source/tmp/images

関連情報