Como forçar relativo que seja absoluto no linux?

1

Eu tenho um software de terceira parte com configuração externa que leva "caminho para o arquivo" como parâmetro de entrada. Infelizmente, este software concatena o caminho dado com algum caminho predefinido. Por exemplo, ele espera 'data / images' como parâmetro e usará '/ Users / someuser / work / source / data / images'. Eu quero especificar e caminho absoluto, mas dando algo como '/ tmp / images' para este software só irá resultar em caminho inexistente '/ Users / someuser / trabalho / fonte // tmp / images' sendo usado :(. É algum truque de caminho que eu posso usar ao lado de '..' para que eu possa dar o software something que resultará em caminho absoluto depois que o software concatenar com o pré-definido.Usando '..' funciona, mas não é uma solução muito boa o uso de software de caminho estático e pré-definido pode mudar.

    
por grigoryvp 09.09.2011 / 08:17

2 respostas

2

Existem inúmeras possibilidades para que /Users/someuser/work/source/XXX aponte onde você quiser no Linux:

  • Use links simbólicos - fazendo algo como:

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

    faria com que /Users/someuser/work/source/XXX aparecesse como um diretório. Se algum software viajasse para lá e / ou gravasse arquivos lá, eles acabariam em /wherever/you/want .

  • Monte outro sistema de arquivos em XXX , ou seja,

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

    Desta forma, você terá seu dispositivo / dev / something montado no diretório no qual o aplicativo escreveria.

  • Faça um "bind mount", isto é, religue uma parte de algum outro sistema de arquivos (já montado) para XXX :

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

    Funciona muito como um link simbólico, mas é muito mais difícil de detectar por aplicativo. O aplicativo pode verificar facilmente se o diretório de destino é um link simbólico e recusar gravar lá, enquanto o método de montagem de ligação fornece um diretório normal, mas seu conteúdo seria

  • Use um sistema de arquivos semelhante a unionfs, como unionfs ou aufs - desta forma você pode "unificar", ou seja, montar simultaneamente vários sistemas de arquivos em um diretório (ou seja, XXX )

  • Jogue alguns truques com LD_PRELOAD e bibliotecas que substituem métodos, como open() , fopen() , etc - o mais proeminente é fusível , ou seja, você pode querer verificar sistemas de arquivos semelhantes a Union para FUSE .

por 09.09.2011 / 10:03
0

Se você ligar simbolicamente /Users/someuser/work/source/ a / (root)

work$ ln -s / source

Todo caminho será baseado na raiz:

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

apontará para

/tmp/images

que você pode verificar por

work$ ls source/tmp/images
    
por 09.09.2011 / 08:26

Tags