Criação repetida do descritor de arquivo apontando para o mesmo arquivo, bash

3

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.

    
por Trevor Young 03.08.2016 / 08:44

1 resposta

1

bash manipula os redirecionamentos dos descritores de arquivo padrão 1 (saída) e 2 (erro) primeiro liberando-os. Afora isso, ele não faz nenhuma ação especial (não se importa com o que o descritor de arquivo pode ter sido usado), simplesmente chamando dup2 para estabelecer uma conexão nova com o arquivo.

Contanto que você tenha o descritor de arquivo aberto, ele seguirá o mesmo arquivo por meio de um renomear . Mas abrir um novo descritor de arquivo depois que o arquivo for renomeado gravará em um novo arquivo em vez de continuar gravando no antigo. Da mesma forma, um subprocesso que grava no arquivo antigo continuará até que o descritor seja fechado

Leitura adicional (código fonte):

por 03.08.2016 / 11:25