cat STDIN não funcionará duas vezes no script

2

Eu tenho um script que gera várias informações e os campos de texto de um formulário html (método POST). Quando tento cat < & 0; ele é exibido corretamente. No entanto, algumas linhas abaixo, eu tento cat < & 0 novamente e nada é impresso. O que estou fazendo errado?

....
cat <&0
echo Content length is $CONTENT_LENGTH
cat <&0 | sed -e 's/&/\n/g' | cut -d'=' -f2

....
    
por swam 06.11.2014 / 22:28

2 respostas

8

Você não está fazendo nada errado: é isso que devemos esperar.

O primeiro cat <&0 consome todo o conteúdo da entrada padrão, porque é isso que o cat faz: lê todas as suas entradas até o final.

Quando o segundo cat <&0 é executado, não há mais nada a ser consumido na entrada padrão: o fim do arquivo já foi alcançado anteriormente.

Se, em um script de shell, você precisar fazer 2 ou mais passagens por meio de sua entrada padrão, será necessário despejá-lo em um arquivo temporário e processar o arquivo temporário quantas vezes desejar.

A criação segura de arquivos temporários em /tmp e a certeza de que eles são descartados corretamente quando seu script é encerrado ou morre é deixada como um exercício para você: -)

A propósito, o <&0 é desnecessário e não faz nada. Sua função é apontar a entrada padrão para o descritor de arquivo 0 ... que é a entrada padrão ... que é, por definição, onde a entrada padrão já aponta! Você pode apenas fazer esse comando cat sozinho.

    
por 06.11.2014 / 22:36
5

Se você quiser ler a partir da entrada padrão duas vezes, você precisa armazená-lo de alguma forma (provavelmente, em um arquivo temporário). O primeiro cat pode ser substituído por uma chamada para tee , que também grava os dados em um arquivo, que pode ser relido pela segunda chamada para cat (o que não é necessário; sed pode ler a partir do arquivo diretamente).

tee > input_buffer  # Copy standard input to a file and standard output
echo Content length is $CONTENT_LENGTH
sed -e 's/&/\n/g' input_buffer | cut -d = -f2 
    
por 06.11.2014 / 22:36