Posso criar um “arquivo” que, quando aberto, forneça a saída de um comando?

4

Eu encontrei-me em algumas situações agora onde eu gostaria de ter um "arquivo" que essencialmente roda um script sempre que ele é "aberto", permitindo-me "ler" sua saída.

Por exemplo, eu posso ter um arquivo de configuração em algum projeto que gostaria de usar localmente, mas devido a diferenças na minha máquina eu preciso executar um sed ou grep para fazê-lo funcionar. O arquivo de configuração do projeto ainda está sendo mantido e gostaria que essas alterações aparecessem na minha configuração local. Isto significa fazer a coisa simples, modificando-a, em seguida, salvá-lo não é ideal, pois é fácil para ele ficar obsoleto como o projeto é atualizado. Eu gostaria que a filtragem acontecesse toda vez que eu abria meu arquivo de configuração local.

Existe alguma maneira de eu conseguir esse tipo de coisa? Eu sei que o sistema de arquivos virtual permite que você faça algumas coisas muito loucas aparecerem como "arquivos", então eu sinto que isso não está fora do reino das possibilidades.

    
por LukeGT 11.12.2014 / 07:02

1 resposta

4

Em teoria, isso é possível usando LD_PRELOAD com o programa desejado.

Escreva uma biblioteca para adicionar um wrapper sobre chamadas de sistema "abertas" e use o programa original (digamos cat ) como LD_PRELOAD=/path/to/library cat .

O código overridden_open () na biblioteca do wrapper seria semelhante ao seguinte código fictício.

/* This is an illustrative code, and doesn't follow any good coding practice. */
int overridden_open (...)
{
    /* Only do this for the config file. */
    if (strcmp (filename, "/path/to/required/config/file") == 0)
    {
        /* Download a fresh copy, and if successful, overwrite the existing file. */
        if (system ("wget -O /path/to/required/config/file.tmp http://remote.file/url") == 0 && system ("<perform awk/sed/grep operations>") == 0)
        {
            system ("mv /path/to/required/config/file.tmp /path/to/required/config/file");
        }
    }
    return open (...);
}
    
por 08.01.2015 / 22:13