Cria um arquivo virtual que é na verdade um comando

12

Existe alguma maneira de criar um arquivo virtual, tal que a leitura do arquivo seja realmente lida a partir do stdout de um comando; escrever para o arquivo está realmente escrevendo para o stdin de um comando?

Até agora eu tenho kludged isso com um inotifywait em um arquivo, que chama um comando quando o arquivo é modificado, tomando sua entrada do arquivo e gravar de volta para ele.

Eu não gosto que o inotifywait tenha que ser reiniciado constantemente (e eu tenho que garantir que ele esteja sempre rodando). Eu só uso esse arquivo talvez duas vezes por semana.

    
por jsj 06.03.2013 / 00:59

3 respostas

14

Você pode estar procurando um canal nomeado .

mkfifo f
{
  echo 'V cebqhpr bhgchg.'
  sleep 2
  echo 'Urer vf zber bhgchg.'
} >f
rot13 < f

Escrever no pipe não inicia o programa de audição. Se você quiser processar a entrada em um loop, você precisa manter um programa de escuta em execução.

while true; do rot13 <f >decoded-output-$(date +%s.%N); done

Observe que todos os dados gravados no pipe são mesclados, mesmo se houver vários processos sendo gravados. Se vários processos estiverem sendo lidos, apenas um obterá os dados. Portanto, um pipe pode não ser adequado para situações simultâneas.

Um soquete nomeado pode manipular conexões simultâneas, mas isso está além dos recursos para scripts básicos de shell.

Na extremidade mais complexa da escala estão os sistemas de arquivos personalizados , que permitem projetar e montar um sistema de arquivos em que cada open , write , etc., aciona uma função em um programa. O investimento mínimo é de dezenas de linhas de código não trivial, por exemplo, em Python . Se você quiser apenas executar comandos ao ler arquivos, poderá usar scriptfs ou fuseflt .

    
por 06.03.2013 / 01:07
3

Algumas coisas que você deve saber sobre pipes nomeados: um pipe não pode - diferentemente de um arquivo - ter vários leitores. Uma vez que seu conteúdo é lido, ele desapareceu. Então você precisa fazer um loop, ou seja, você precisará enviar constantemente conteúdo para o pipe a partir do gravador.

Estou procurando uma resposta para essa pergunta e a única outra coisa que consegui criar é scriptfs que é baseado no fusível .

    
por 25.03.2014 / 13:38
1

O que você descreve é essencialmente um arquivo especial FIFO, veja fifo(7) . Eles são criados por mkfifo(1) , e um processo pode então abri-los no Linux para R / W (nem todos os sistemas Unixy lidam com isso). Dois processos independentes podem usá-lo para se comunicar.

    
por 06.03.2013 / 01:09

Tags