Comando que imprime o conteúdo do arquivo dado nome do arquivo no stdin

2

Eu tenho um comando que produz alguma parte de saída, que é na verdade um nome de arquivo contendo os dados de saída completos. Eu quero extrair o nome do arquivo (o que eu trivialmente faço com cut ) e, em seguida, passá-lo para outro programa como cat , que exibirá o conteúdo desse arquivo.

Não consigo compartilhar o comando real em execução, mas, para fins de reprodutibilidade, é possível substituir ./my-command args por echo 1:2:3:4:file.txt

Então eu tentei o seguinte:

./my-command args | cut -d : -f 5 | cat

Entretanto, isso apenas imprime o nome do arquivo, pois cat simplesmente copia o conteúdo de stdin (que contém meu nome de arquivo) para stdout quando é invocado sem nenhum argumento.

Agora eu sei que eu posso contornar isso é Bash invertendo o fluxo de comandos e essencialmente passando cat o argumento via sub-shell, por exemplo

cat './my-command args | cut -d : -f 5'

E isso irá imprimir o conteúdo do arquivo, no entanto, isso não é particularmente amigável, pois não posso simplesmente canalizar a saída do meu comando subjacente, acrescentando um comando simples à minha invocação.

Existe um programa cat like que irá receber nomes de arquivos em stdin e imprimir seu conteúdo? Ou existe uma maneira de obter cat para tratar stdin como argumentos?

Notas

Eu percebo que eu poderia definir uma função bash que leria nomes de arquivos de stdin e invocaria cat neles em meu próprio ambiente. No entanto, esta técnica para descarregar os dados de saída diretamente precisa ser incluída na documentação do usuário final e uma abordagem agnóstica simples de shell é altamente preferível.

    
por RobV 09.12.2014 / 13:32

1 resposta

4

Depois de pesquisar um pouco mais, percebi que esse cenário é exatamente o que xargs é projetado para:

./my-command args | cut -d : -f 5 | xargs cat

Que transformará a saída de stdin em uma invocação de cat com um nome de arquivo real e, portanto, imprimirá o conteúdo do arquivo

    
por 09.12.2014 / 13:32

Tags