Uma abordagem de baixa tecnologia é
tr -cd "'\n" < run_me.sh | awk 'length%2==1 {print NR, $0}'
O tr
exclui todos os caracteres, exceto as aspas simples e as novas linhas,
e o awk
identifica as linhas que possuem números ímpares de caracteres
(isto é, cotações não correspondentes).
Confira-os individualmente;
Observe que as strings válidas, como "That's not a bug!"
, serão sinalizadas.
Se isso não destacar o problema, tente novamente com '"\n'
(para encontrar aspas duplas não correspondentes).
Em seguida, expanda o tr
para permitir ()
, {}
e, finalmente, {}
para passar. Neste ponto,
a inspeção manual da produção se torna uma busca menos proveitosa;
enquanto (
e )
são geralmente correspondidos na mesma linha,
e citações e colchetes quase sempre são,
isso não é verdade de {
e }
.
Se você reduziu o problema a uma incompatibilidade de chaves,
e, especialmente, se você restringiu um intervalo no arquivo, vá para o Plano B.
Abra o arquivo em vim
(ou vi
).
Vá para um caractere {
que você acredita ser antes do erro e digite %
.
Se o cursor pular para o }
que você acha que corresponde ao {
que você começou,
avance para o próximo {
e repita.
Se ele pular para um }
que não corresponde ao {
iniciado,
o erro ocorre entre essas duas chaves.
Se não se move,
o erro ocorre entre a sua localização atual e o final do arquivo.
Zoom in.
Essa abordagem pode ser um pouco mais adequada para arquivos de programa em linguagens como C, C ++ e Java (se seus compiladores não fizerem um bom trabalho), mas deve funcionar muito bem para scripts de shell.