Arquivo de tubulação para um comando que não implementa a tubulação

1
$ cat foo
foo
bar

Agora, se eu fizer isso:

$ some_program foo

Está funcionando.

Mas se eu tentar:

$ cat foo | some_program

Não está funcionando.

Eu estou procurando uma maneira limpa de canalizar a entrada para some_program sem ter que usar arquivos temporários confusos.

    
por ms123 14.03.2012 / 11:01

3 respostas

2

O Piping colocará o stdout de cat foo na stdin de some_program . Nesse caso, some_program está esperando um argumento, não stdin, então você desejará armazenar o resultado de cat foo em uma variável e, em seguida, chamar some_program $variable .

Não tenho muita certeza sobre scripts de bash, mas tente isso?

bar='cat foo'
some_program $bar

Na verdade, talvez isso funcione ...

some_program 'cat foo'
    
por 14.03.2012 / 11:06
2

No bash você pode usar a substituição de processos

$ some_program <(cat foo)

Você pode adicionar tantos parâmetros quanto quiser dessa maneira, desde que saiba que esses parâmetros serão nomes de arquivos que serão somente de leitura. Você não pode ler e escrever ao mesmo tempo.

    
por 14.03.2012 / 12:10
2

Além da maneira como o @Bob propôs, há outro método mais flexível: xargs :

Você poderia usar

cat foo | xargs some_program

que é basicamente equivalente a

some_program 'cat foo'

Se o programa estiver esperando apenas um argumento por vez, você pode fazer

cat foo | xargs -n 1 some_program

E some_program seria chamado uma vez para cada linha de entrada.

Existem muitas outras opções para xargs , como a manipulação cuidadosa de nomes de arquivos "ruins" (com espaços e outros caracteres especiais), limitando o número de processos em execução simultaneamente, etc., que podem ser encontrados em man-page. / p>     

por 14.03.2012 / 13:53