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.
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?
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.
É 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.)
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.
Tags bash stdout file-descriptors