Eu uso o ZoneMinder aqui em casa, que é um software para CFTV (Circuito Fechado de Televisão). Tempos atrás eu bloguei falando do zoneminder. Hoje, quando atualizei para versão 1.24.1-1 notei a seguinte mensagem:
Warning: Cannot modify header information - headers already sent by
(output started at /usr/share/zoneminder/lang/pt_br.php:751) in
/usr/share/zoneminder/includes/functions.php on line 97
Na hora eu já imaginei o que era. Abri o arquivo “/usr/share/zoneminder/lang/pt_br.php” e lá estava, uma linha em branco aṕos a tag ?>, que é a tag que fecha comandos PHP. Olhei os outros arquivos de línguas e alguns deles também possuíam a linha em branco. Então, lá vou eu fazer um patch pra corrigir esse erro. Pensei um pouco, fiz alguns testes e não consegui. Como sou preguiçoso fui logo perguntar pra alguns amigos que também não puderam me dar uma solução na hora. Daí, evitei a fadiga e encontrei o comando abaixo:
sed '${/^$/d}' arquivo
Esse comando só removia uma única linha, eu tinha casos mais de uma linha… Procurei mais e achei um exemplo bem legal:
sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' arquivo
Com esse comando, era só eu fazer um loop nos arquivos de línguas, gerar um novo arquivo com as modificações, executar o diff para comparar as mudanças e salvar num arquivo para enviar pros mantenedores do zoneminder. Acabei escrevendo o script abaixo:
#!/bin/bash
files=$( find . -name "*.php" )
# remove as linhas em branco do final do arquivo e cria um arquivo temporário
for file in $files; do
sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' $file > "$file.new"
done
# faz a comparação entre o arquivo antigo e novo e salva
for file in $files; do
diff -burN $file "$file.new" >> patch.metal
done
# remove os arquivos temporários
find . -name "*.new" | xargs rm
Aṕos executar o script acima, abri o arquivo gerado, o “patch.metal” e fui conferir. Aparentemente tudo certo, agora vou abrir o bug e torcer pra ele não ficar mais de um ano pra ser fechado.
UPDATE:
Bug reportado, #531910, agora vamo ver…
Walter Cruz
Coda, coda, coda!