Mapear a leitura / gravação de um arquivo para obter saída de / envio de entrada para um script?

1

Suponha que eu tenha dois scripts, script1.sh e script2.sh . Eu estou querendo saber se existe uma maneira de fazer uma interface de sistema de arquivos tal que, por exemplo, eu posso ir vim file e então meu sistema executa script1.sh e tem a saída do script dentro do meu editor. Então, quando eu escrevo o arquivo, o sistema envia o texto modificado como entrada canalizada para script2.sh .

Isso é possível? Eu olhei em usando 'inotify', que poderia executar o meu script desejado quando o arquivo foi alterado. Mas eu ainda não descobri como fazer a primeira parte, onde abrir o arquivo em si só pega a saída padrão de algum script.

    
por everybody 29.11.2014 / 19:05

2 respostas

0

A ferramenta para este trabalho é FUSE (FUSE significa Filesystem in USErspace). O FUSE permite que um sistema de arquivos seja implementado por um programa do usuário. Se você executar vim file e file estiver em um sistema de arquivos FUSE, o programa que fornece o sistema de arquivos gerará o conteúdo do arquivo quando o Vim ler a partir dele e armazenará (ou não armazenará!) O conteúdo quando o Vim salvar o arquivo. / p>

O FUSE é mais elaborado do que o que você está pedindo. O programa que fornece o sistema de arquivos não apenas gerencia o conteúdo do arquivo, mas também estrutura de diretório, permissões, etc. Ele também precisa gerenciar leituras e gravações de um trecho de cada arquivo, a menos que você torne os arquivos não-pesquisáveis (o que restringirá os programas). que pode trabalhar neles).

Não estou ciente de nenhum projeto que se baseie no FUSE para fornecer apenas uma interface para manipular o conteúdo do arquivo e, ao mesmo tempo, fornecer uma estrutura de diretório clássica. Existem exemplos de sistemas de arquivos dos quais você pode copiar o código.

    
por 30.11.2014 / 01:49
0

Esta função de shell fará o que você perguntar:

vim() { bash script1.sh <"$1" >"$1.hide~"; /usr/bin/vim "$1.hide~"; bash script2.sh <"$1.hide~"; }

Use esta função da seguinte forma:

vim file

Quebrando em pedaços:

  • bash script1.sh <"$1" >"$1.hide~"

    $1 é o primeiro argumento que você fornece ao script, que deve ser o nome de um arquivo. Isso executa 'script1.sh com esse arquivo em seu arquivo stdin e grava a saída em um arquivo temporário.

  • /usr/bin/vim "$1.hide~"

    Isso executa o% realvim na saída de script1.sh .

    Isso pressupõe que o editor vim em seu sistema está localizado em /usr/bin . Se estiver localizado em outro lugar, ajuste a definição da função adequadamente.

  • bash script2.sh <"$1.hide~"

    Isso fornece o arquivo editado como stdin para script2.sh .

Para tornar esta definição de função permanente, coloque-a como uma linha separada no seu arquivo ~/.bashrc .

    
por 30.11.2014 / 07:47