no script bash; um processo stdout como argumento de arquivo falhar quando você abri-lo mais de uma vez

1

Considere este código de script bash:

#!/bin/bash

function bug_part() {
    cat $1 > sample.first
    cat $1 > sample.second #second time you open file $1, it contains no data
}

bug_part <(echo "TEST")
[ "$(cat sample.first)" != "$(cat sample.second)" ] && echo "THIS IS A BUG" 1>&2 && exit 1
rm sample.first sample.second

Você concorda comigo que este problema é um bug bash? Ou bug do Linux?

Existe alguém que saiba exatamente o que está acontecendo por trás?

    
por Mostafa Nazari 23.08.2015 / 13:44

3 respostas

5

Eu não acho que seja um bug. Você pode ler de / gravar para um pipe nomeado conectado a comandos preparados por substituição de processo apenas uma vez.

    
por 23.08.2015 / 14:17
4

É um erro no seu script. Use tee se quiser duplicar dados que só podem ser lidos uma vez. Como a outra resposta explica, < (cmd) cria um canal e coloca /dev/fd/62 ou similar na linha de comando:

echo <(true)
  /dev/fd/63

Outra alternativa para tee é uma string here:

cmd <<<"$text"

Se você quiser que o bash crie um arquivo tmp que pode ser pesquisado e redirecione a entrada dele. (Eu não sei exatamente como você iria voltar para o início do arquivo dentro da sua função. Eu acho que cat /dev/stdin pode apenas pegar a mesma posição no arquivo.)

    
por 23.08.2015 / 16:32
3

Expandindo a sugestão do @Peter Cordes de usar tee ao invés de tentar ler o arquivo (/ pipe) duas vezes, aqui está uma possível reescrita da função:

bugless_part() {
    tee sample.first >sample.second <"$1"
}

Quando executado como bugless_part <(echo "TEST") , ele coloca "TEST" em ambos os arquivos.

    
por 23.08.2015 / 19:00