Algumas tendências comuns sobre o motivo pelo qual um comando não é analisado adequadamente em um script, mas funciona bem quando é executado por conta própria:
A origem do erro está em outro lugar
O shell reportará um erro na primeira coisa que não espera. Aqui, ele não espera um (
, mas parece que está dentro de uma string entre aspas. Uma possível explicação é que você não está em uma string citada porque o primeiro '
realmente fecha uma citação anterior não fechada em vez de abrir um novo '...'
em like em:
echo It's a bug
formattedTIME='awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' $domPATH/duration.seconds
Isso é realmente:
echo It'quoted-string'{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}'...
E esse (
sem aspas acima é inesperado no shell.
Você tem problemas semelhantes com qualquer estrutura que não esteja adequadamente fechada ou no formato incorreto, como fi
sem then
...
Backticks
Backticks não devem ser usados. $(...)
deve ser usado em seu lugar.
Dentro de backticks, \
é tratado de forma diferente.
echo "'
echo It\\'s OK
'"
não está bem. Mesmo que echo It\\'s OK
por si só esteja OK, como dentro dos backticks, as duas primeiras barras invertidas se tornam uma, então ela acaba sendo echo It\'OK
.
A forma moderna $(...)
não tem esses problemas.
Aliases
aliases são um pouco parecidos com macros, sua expansão passa por interpretação de código novamente.
Coisas como:
alias foo="echo '"
...
foo bar
echo 'baz('
teria o problema oculto na definição do foo
alias.
Existem mais sutis como:
alias foo='a;b'
cmd | foo
Que, sem causar erros de sintaxe, faz com que a análise seja feita de maneira inesperada.
Geralmente, as funções são mais apropriadas que os aliases
localização
Algumas sequências de bytes podem ser interpretadas de forma diferente, dependendo da localidade.
Por exemplo, o byte 0xa0 é o espaço sem quebra no conjunto de caracteres ISO-8859-1. E esse caractere é um espaço em branco no Solaris e bash
trata todos os espaços em branco como delimitadores (atualmente apenas para caracteres de byte único).
Esse 0xa0 byte também faz parte de vários caracteres UTF-8, como à
. Então você pode achar que, por exemplo, um script que tenha:
var=àdo
(com que à
escrito em UTF-8) pára de funcionar quando executado no Solaris em uma localidade ISO-8859-1, porque isso se torna var=X do
(onde X
é o primeiro byte desse à
personagem).
Ou você pode descobrir que:
echo ε
Com isso, ε
escrito no conjunto de caracteres BIG5-HKSCS pára de funcionar quando você não está na zh_HK.big5hkscs
locale, pois ε
é realmente codificado como 0xa3 0x60, onde 0x60 em ASCII e todos conjuntos de caracteres de bytes é o caractere de backtick.