No Kubuntu Linux, o navegador Google Chrome adiciona uma soma de verificação ao arquivo, impedindo simplesmente editar o arquivo manualmente. Então, estou escrevendo um script para adicionar a soma de verificação.
$ cat .config/google-chrome/Default/Custom\ Dictionary.txt
AATEST
dotancohen
checksum_v1 = 2b7288da7c9556608de620e65308efa4$
Sem problemas, copiarei o arquivo inteiro, exceto a última linha, e verificarei se o hash MD5 corresponde à soma de verificação.
$ head -n -1 .config/google-chrome/Default/Custom\ Dictionary.txt > ~/chrome-dict
$ cat ~/chrome-dict
AATEST
dotancohen
$ md5sum ~/chrome-dict
2b7288da7c9556608de620e65308efa4 /home/dotancohen/chrome-dict
Obtivemos 2b7288da7c9556608de620e65308efa4
, como esperado. Corresponde! Então, vamos adicionar isso ao final do arquivo.
$ { printf "checksum_v1 = " ; printf $(md5sum -z ~/chrome-dict | awk '{print $1}') ; } >> ~/chrome-dict
$ cat ~/chrome-dict
AATEST
dotancohen
checksum_v1 = 08f7dd79a17e12b178a1010057ef5e34$
Não, checksum errado! Vamos tentar cat para garantir que nada seja escrito no arquivo entre as duas printf
instruções.
$ head -n -1 .config/google-chrome/Default/Custom\ Dictionary.txt > ~/chrome-dict
$ cat ~/chrome-dict
AATEST
dotancohen
$ { printf "checksum_v1 = " ; printf $(md5sum -z ~/chrome-dict | awk '{print $1}') ; } | cat >> ~/chrome-dict
$ cat ~/chrome-dict
AATEST
dotancohen
checksum_v1 = 08f7dd79a17e12b178a1010057ef5e34$
Ainda checksum errado! Vamos tentar um arquivo tmp.
$ head -n -1 .config/google-chrome/Default/Custom\ Dictionary.txt > ~/chrome-dict
$ cat ~/chrome-dict
AATEST
dotancohen
$ { printf "checksum_v1 = " ; printf $(md5sum -z ~/chrome-dict | awk '{print $1}') ; } >> ~/chrome-dict-tmp
$ cat ~/chrome-dict-tmp >> ~/chrome-dict && rm ~/chrome-dict-tmp
$ cat ~/chrome-dict
AATEST
dotancohen
checksum_v1 = 2b7288da7c9556608de620e65308efa4$
Funcionou! Por que os one-liners que redirecionam a saída para o fim do ~/chrome-dict
arquivo não retornaram o hash MD5 correto?
{ … } >> ~/chrome-dict
não agrega a saída de…
para enviá-la ao arquivo depois que tudo terminar, ele apenas faz as ferramentas dentro herdarem o mesmo descritor de arquivo. Seumd5sum
funciona depois do primeiroprintf
e, portanto, ele pode ler o arquivo com algum texto já anexado.Faça
md5sum
executar antes de tudo que for anexado ao arquivo. É fácil quando você faz toda a impressão com um únicoprintf
:Agora o interior de
$()
tem que sair antesprintf
mesmo de ser iniciado, então não há riscoprintf
de appends no arquivo antes demd5sum
ler todo ele. No seu código original, apenas o segundoprintf
foi "bloqueado" por isso.Seu
awk
pode funcionar bem com uma linha incompleta e um byte nulo de terminação, mas em geral é melhor dar às ferramentas de texto o texto adequado; portanto, eu descartei-z
enquanto invocavamd5sum
. No nosso caso, seawk
funciona de qualquer maneira, entãoprint $1
funcionará da mesma forma e$()
removerá a nova linha final de qualquer maneira. Mas se a implementação doawk
texto estritamente necessário, então-z
apenas quebraria as coisas.Problema : você não pode fazer isso assim:
como apontado por @Ed, você não pode ler e escrever no mesmo arquivo ao mesmo tempo por padrão.
Solução : você precisa de
sponge
uma ferramenta demoreutils
: