Por que não consigo sobrescrever um arquivo com valor processado?

0

Esta questão solicitada um pensamento que eu não tinha certeza se entendia bem. Eu sei que não é possível ou correto usar pipelines como cat myfile | grep -v mypattern > myfile devido a como as alças de arquivos são configuradas. No entanto, por que não podemos simplesmente usar cat myfile | grep -v mypattern| tee myfile>/dev/null para modificar o arquivo? Há algum exemplo simples em que ele falha?

Especificamente, isso leva a corrupção ou é mais de não estar no local de edição, mas sim sobrescrever?

Atualizando a pergunta, agradecemos se as respostas considerassem isso também:

Há problemas com o uso de cat myfile | grep -v mypattern| bash -c 'rm myfile; cat > myfile' ?

    
por rahul 01.05.2016 / 02:35

2 respostas

1

Oproblemaéquevocênãopodegarantirqueéexecutadoprimeiro.Portanto,vocêprecisaatrasaradesvinculaçãoeagravaçãonoarquivoatétercertezaabsolutadequeoarquivoestáabertoparaleitura.

IssoarmazenaráoarquivonaRAMantesdeescrevê-lo.

catfoo|perl-e'undef$/;@out=<>;openWRT,">",shift; print WRT @out' foo

Vantagem: Mantém as permissões do foo. Se interrompido, você não perdeu o foo original.

Desvantagem: foo deve caber na RAM.

Isso abrirá o arquivo para leitura, removê-lo e cat dele. É paralelamente esperar que o arquivo desapareça, e quando ele sumir cat .

(rm foo; cat) < foo | (perl -e 'while(-e "foo"){}'; cat >foo)

Vantagem: curta. Funciona em arquivos maiores que a RAM.

Desvantagem: foo desaparece assim que você começa.

(mv foo bar; cat) < foo | (perl -e 'while(-e "foo"){}'; cat >foo && rm bar)

Vantagem: funciona em arquivos maiores que a RAM. Se falhar, foo é mantido como backup na barra.

    
por 01.05.2016 / 09:27
1

Você não pode simplesmente fazer isso porque o comando tee sobrescreve o arquivo, tornando-o mais curto (provavelmente) e eliminando a capacidade do comando cat de ler os dados que estavam no arquivo.

Se você pudesse garantir que programas como tee abrissem um arquivo novo , e se o shell garantisse que cat abrisse sua cópia primeiro, você poderia copiar do arquivo antigo (na verdade excluído) para o novo. Mas há muitos ifs e poucas garantias.

Você pode supor, por exemplo, que cat seria iniciado primeiro e tee depois (quando necessário para capturar dados). Mas o shell inicia ambos, e a menos que tee esteja esperando pela entrada antes que cat inicie, as gravações podem falhar (já que ninguém está esperando, e esses bytes não têm para onde ir). É mais fácil fazer com que os processos esperem em read do que em write .

    
por 01.05.2016 / 02:37