Piping retorna ao programa que os gera

0

Eu tenho um programa que pode receber entrada de stdin e produz saída no stdout assim:

cat initial_input.txt | myprogram myindex myoptions - | filter_output > outfile.txt

O programa carrega uma estrutura de dados (myindex) antes de começar a processar a entrada, e isso pode demorar um pouco. Parte da saída é passível de ser devolvida ao programa. Eu quero canalizar parte do stdout de volta para o stdin que o programa leva, para que ele seja anexado no final da entrada inicial com o qual o programa foi chamado, sem interromper a execução inicial do programa, já que leva tempo para carregar inicialmente o myindex para isso.

Existe uma maneira de fazer isso?

    
por 719016 17.06.2011 / 10:03

1 resposta

3

Você pode conseguir isso com a cauda:

tail -f initial_input.txt -n 100000 | myprogram myindex myoptions - | filter_output >> initial_input.txt

Os bits importantes aqui são:

  • cauda; Isso funciona exatamente como o cat, mas (com a opção -f) ele "segue" o final do arquivo, de modo que, à medida que o arquivo cresce, ele despeja mais dados no stdout. A opção -n especifica quantas linhas serão despejadas inicialmente (por padrão, acho que apenas 10), então você precisará que esse número seja pelo menos tão grande quanto o número original de linhas no arquivo.
  • ; Notice at the end I use >> instead of > as in your question. This tells the shell to append to, rather than over-write the existing file.

Por favor, esteja ciente de que isso pode ser uma coisa "perigosa" se você não estiver em um ambiente rigidamente controlado. E o que quero dizer com "rigidamente controlado" é que você sabe que ninguém mais lerá ou gravará em seu arquivo initial_input.txt. Se mais de um processo estiver tentando gravar nesse arquivo de uma só vez, você obterá lixo dele. Mas parece que você provavelmente está trabalhando em arquivos que só você modifica, e você mesmo os coloca lá, então você deve estar seguro.

    
por 17.06.2011 / 10:08