Se eu criar um descritor de arquivo no bash e apontá-lo em um arquivo e colocar alguns dados nele:
exec 5>>file
for i in {1..10000}; do
echo "$i" >&5
done
O descritor de arquivo 5 mantém aberto "arquivo" e sempre que eu gravar dados para esse descritor, ele anexa os dados e mantém seu lugar atual no arquivo.
Se eu apontar novamente o mesmo descritor para o mesmo arquivo:
exec 5>>file
Fecha o fd atual e recria um novo apontando para o mesmo arquivo? Então, da próxima vez que eu escrever dados, ele terá que encontrar o final do arquivo antes de acrescentar ao final? Ou, é inteligente o suficiente para perceber que o descritor já está apontado para esse arquivo e não fazer nada. O que está acontecendo em um nível baixo?
edite:
Mais especificamente, estou registrando dados em um arquivo usando descritores de arquivo para manter o arquivo aberto. Alguns bits relevantes:
recv_udp () { # Receives a udp stream, timestamps and removes commas and the period from the seconds field, deletes blank lines.
socat -L "$LOCKFILE" -u udp-recv:"$UDP_IN",reuseaddr STDIO | ts '%Y %j %H %M %.S' | sed -u -e 's/,/ /g' -e 's/\./ /' -e '/^$/d' &
}
file_handle () { # Points file descriptor 9 to the desired log file
exec 9>>"$DATADIR"/"$CRUISEID"/"$STAMP"/"$STAMP"_"$JDY"_raw
}
parse_lci90i () { # Parse lci90i winch controller mtnw2 data stream.
echo "Started $STAMP $CRUISEID $(date +'%c')" >> "$LOGFILE"
while read YR JDY HR MIN SEC uS GARBAGE GARBAGE TENS SPD LINE CHKSUM; do
printf '%4.0f %03.0f %02.0f %02.0f %02.0f %.3s %s %.0f %.1f %.0f\n' "$YR" "$JDY" "$HR" "$MIN" "$SEC" "$uS" "$STAMP" "$SPD" "$LINE" "$TENS"
check_path
file_handle
printf '%4.0f %03.0f %02.0f %02.0f %02.0f %.3s %s %.0f %.1f %.0f\n' "$YR" "$JDY" "$HR" "$MIN" "$SEC" "$uS" "$STAMP" "$SPD" "$LINE" "$TENS" >&9
done
}
O Socat lê um feed de 20dz e o bombeia para um analisador via substituição de processo. Você pode ver aqui que toda vez que uma linha de dados é lida, o descritor de arquivo é refeito. Então, sim, estou curioso sobre se isso é ou não mais eficiente do que apenas pegar o stdout do analisador e apenas > > direto no arquivo de log.
Obrigado pelas respostas até agora, você é muito perspicaz. O nome do arquivo de dados contém o dia juliano do registro de data e hora dos dados, portanto, o arquivo de log passa todos os dias quando a data é alterada.