É um pouco brega, mas:
my_temp_file=$(mktemp)
cat > "$my_temp_file"
foo "$my_temp_file"
cat "$my_temp_file"
rm -f "$my_temp_file"
Caso não seja óbvio, isso
- lê stdin e escreve em um arquivo,
- chama seu programa
foo
no arquivo temporário, - lê o arquivo temporário e o grava no stdout e
- exclui o arquivo temporário.
Isso falhará se os dados a serem processados
são grandes demais para caber em um arquivo em /tmp
.
Você pode ser capaz de atenuar isso um pouco
usando a opção --tmpdir
para mktemp
para colocar o arquivo temporário em um sistema de arquivos que tenha mais espaço livre.
Conectar comandos com &&
é a última moda dos dias de hoje.
Pode fazer um pouco mais de sentido dizer
my_temp_file=$(mktemp) && {
cat > "$my_temp_file" && {
foo "$my_temp_file"
cat "$my_temp_file"
}
rm -f "$my_temp_file"
}
porque
- se
mktemp
falhar, você não tem um arquivo temporário, e não há nada que você possa fazer, - se
cat > "$my_temp_file"
falhar, você não capturou a entrada, então não há nada que você possa fazer (exceto que você ainda deseja excluir o arquivo temporário)
Se o status de saída de foo
for importante para você,
lidar com isso de forma adequada.
Opcionalmente, torne isso um pouco mais à prova de balas configurando um trap
para fazer o rm
mesmo se as coisas ficarem de lado.