Looping através de linhas no arquivo usando o bash e passando para a variável. A variável resultante não é o mesmo valor do arquivo, por quê?

1

Eu tenho um script bash (apenas fazendo algumas correspondências de padrões de arquivo de log simples) que eu tenho rodando em um cron por alguns anos. Recentemente quebrou e começou a retornar resultados estranhos. Após cavar o script e fazer algumas depurações nele, descobri que o problema parece ser com um loop while que faço em um arquivo.

Para ilustrar o problema, eu fiz um cat no arquivo 'cat / var / tmp / file' e obtive o que espero obter, que é um registro de data e hora e alguns IDs (não formatados):

15:56:14,965 [,PCC12345678(PSI12345678),,]
18:08:43,706 [,PCC23456789(PSI23456789),,]
12:01:49,233 [,PCC34567891(PSI34567891),,]

Quando eu coloco isso em um loop while eu esperaria que ele permanecesse o mesmo, mas isso não acontece. Quando faço eco da linha no loop, o segundo campo (os IDs) é sempre alterado para '1', assim:

cat /var/tmp/file | while read line
do
echo $line
done

Isso me dá uma saída de:

15:56:14,965 1
18:08:43,706 1
12:01:49,233 1

O que é obviamente completamente diferente do que está no arquivo e me deixou perplexa.

Coisas que eu tentei até agora:

  • Eu pensei que talvez a variável $ line ficou presa na memória, então tentei limpar isso, não funcionou.
  • Eu experimentei o clássico 'desligue e ligue novamente' para o servidor por falta de ideias melhores, achando que talvez isso pudesse limpar tudo o que possa ter ficado preso.
  • Tentei executar o script em outros dois servidores e tive o mesmo problema.

Atualmente, estou pensando que talvez não goste do formato do arquivo, possivelmente relacionado aos colchetes ou vírgulas. Embora eu não saiba por que isso aconteceria ou por que isso aconteceria de repente.

Nota: Nada foi alterado no script ou nos arquivos de log em execução desde que foram gravados. Estava trabalhando anteriormente por dois anos.

Editar: Após sugestões, verifiquei o que pode ter mudado no ambiente, tanto quanto eu posso dizer o mesmo. A menos que algo tenha mudado com uma atualização do sistema operacional (que eu não sei como verificar):

  • .bash_profile e .profile não foram editados em mais de três anos.
  • Eu tentei executar o script em outros shells ksh, bash, csh. O mesmo problema encontrado em todos eles.
  • Eu tentei executar o script com outros usuários, incluindo o root. Novamente o mesmo problema com todos eles.

Obrigado Matt

    
por MattM 02.02.2016 / 05:41

1 resposta

3

Você tem um arquivo chamado 1 no diretório em que o script está sendo executado.

Como MelBurslan comentou, [] tem um significado especial para o shell, mas não tem muito a ver com regexes: significa apenas "um único caractere tirado de qualquer um dos caracteres entre os colchetes". Então quando você corre

echo 15:56:14,965 [,PCC12345678(PSI12345678),,]

o shell procura um arquivo chamado , ou P ou C ou 1 ... Se pelo menos um arquivo corresponder, [,PCC12345678(PSI12345678),,] será substituído por todos os nomes de arquivo correspondentes a saída; caso contrário, é reproduzido como é.

Se você remover o arquivo 1 , o comportamento antigo deverá ser restaurado. Você pode corrigir o script protegendo $line :

cat /var/tmp/file | while read line
do
echo "$line"
done
    
por 02.02.2016 / 18:48