Como incluir programas que só funcionam com arquivos de entrada / saída em um pipeline?

3

Eu preciso processar imagens com várias ferramentas em um pipeline tool1 | tool2 | tool3 | ... . Aparentemente, uma das ferramentas não foi projetada para funcionar em um pipeline e funciona apenas no formato user@computer:/~# bad_tool infile.png outfile.png .

Existe alguma maneira de incluí-lo no pipeline? Eu realmente quero evitar a criação de arquivos para este único programa e depois removê-los, etc.

    
por bazzilic 07.06.2012 / 12:20

3 respostas

4

se isso satisfaz você, aqui está a proposição de como fazer isso usando pipes.

A suposição é que os arquivos de entrada e saída de "badtool" podem ser pipes.

mkfifo IF
mkfifo OF

# one therminal
tool | tool2 |... tooln > IF

# second terminal
bad_tool IF OF

#third terminal
tooln+1 < OF | tool n+2 | tool n+3 ...

Se você gostaria de criar um script, você pode incluir essas partes em funções:

function A(){ ... }
function B(){ ... }
function C(){ ... }
# and run in background in parallel
A&
B&
C&

Continue com todas as suas imagens (os canais IF e OF são "reutilizáveis") e, após todo o trabalho, exclua-os

rm IF OF
    
por 07.06.2012 / 12:42
5

Se o pipeline normalmente seria:

tool1 | tool2 | tool3

mas tool2 é o “ruim” que requer 2 parâmetros (1o arquivo de entrada, 2º arquivo de saída), você pode reescrevê-lo assim:

tool2 <(tool1) >(tool3)

Claro, se o seu shell suportar substituição de processos .

    
por 07.06.2012 / 12:53
4

Se isso é linux, você pode fazer

bad_tool /dev/stdin /dev/stdout

/dev/stdin e /dev/stdout são apenas links simbólicos para /proc/self/fd/{0,1} (respectivamente).

    
por 07.06.2012 / 14:10