У меня есть стороннее программное обеспечение с внешней конфигурацией, которое принимает «путь к файлу» в качестве входного параметра. К сожалению, это программное обеспечение объединяет заданный путь с некоторым предопределенным путем. Например, оно ожидает «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
Он работает во многом как символическая ссылка, но его гораздо сложнее обнаружить приложению. Приложение может легко проверить, является ли целевой каталог символической ссылкой, и отказаться писать туда, в то время как метод монтирования bind предоставляет обычный каталог, но его содержимое будет
Используйте файловую систему типа unionfs, напримерunionfsилиауфс- таким образом можно «унифицировать», т.е. одновременно монтировать несколько файловых систем в одном каталоге (т.е.
XXX
)Поэкспериментируйте с LD_PRELOAD и библиотеками, которые переопределяют методы, такие как
open()
,fopen()
, и т.д. - наиболее известный из них -предохранитель, а именно, вы можете захотеть проверитьФайловые системы типа Union для FUSE.
решение2
Если вы создаете символическую ссылку /Users/someuser/work/source/
на /
(корень)
work$ ln -s / source
Каждый путь будет основан на корне:
/Users/someuser/work/source/tmp/images
будет указывать на
/tmp/images
который вы можете проверить
work$ ls source/tmp/images