shell script com bug interessante

2

Eu encontrei esse comportamento do bash GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu) e até mais recente (Como obter a versão do dash?) traço no Debian.

Bug como está:

/bin/echo "Silent Err 'unexpected EOF while looking for matching' Example:"

if [ 0 -eq 1 ]; then
        /bin/echo "HERE IS MISTAKE WITHOUT QUOTE IN THE END
        exit
fi

/bin/echo " BLACK HOLE "
/bin/echo " CODE WILL NEVER PROCEED "

if [ 0 -eq 1 ]; then
        /bin/echo "SECOND MISTAKE
        exit
fi
/bin/echo "normal code... will work";
/bin/echo "Good and silent exit without any notice about BLACK HOLE code..."
/bin/echo "exit."

Lançamento:

# bash bug_as_is.sh 
Silent Err 'unexpected EOF while looking for matching' Example:
normal code... will work
Good and silent exit without any notice about BLACK HOLE code place...
exit.

Somente se o primeiro bloco if then fi for citado, o erro será exibido:

# bash unbug.sh 
Silent Err 'unexpected EOF while looking for matching' Example:
 BLACK HOLE 
 CODE WILL NEVER PROCEED 
unbug.sh: line 20: unexpected EOF while looking for matching '"'
unbug.sh: line 24: syntax error: unexpected end of file

É um bug conhecido comum ou eu encontrei um diamante verdadeiro? (;

E qual é a espinha dorsal desse comportamento?

    
por bashbugbounty 25.10.2015 / 21:31

2 respostas

4

Não há bug no bash: o código está funcionando exatamente como deveria.

O

bash permite que strings com várias linhas sejam usadas como argumentos para echo , mesmo que essas strings pareçam estranhas e contenham o que seria o bash code.

Observe que o seguinte é simplesmente uma instrução echo com uma sequência multilinha para saída:

        /bin/echo "HERE IS MISTAKE WITHOUT QUOTE IN THE END
        exit
fi

/bin/echo " BLACK HOLE "
/bin/echo " CODE WILL NEVER PROCEED "

if [ 0 -eq 1 ]; then
        /bin/echo "SECOND MISTAKE

Para esclarecer, vamos substituir essa longa string por "multiline string omitted" . Então, o código é simplesmente:

/bin/echo "Silent Err 'unexpected EOF while looking for matching' Example:"

if [ 0 -eq 1 ]; then
        /bin/echo "multiline string omitted"
        exit
fi
/bin/echo "normal code... will work";
/bin/echo "Good and silent exit without any notice about BLACK HOLE code..."
/bin/echo "exit."

O código acima está funcionando corretamente.

    
por 25.10.2015 / 21:46
1

Não tenho certeza do que "espinha dorsal desse comportamento" significa, mas conforme o interpreto:

A (aparentemente) não editada string "HERE IS MISTAKE WITHOUT QUOTE IN THE END na verdade apenas inicia um literal de string entre aspas. Esse literal de string ultrapassa o primeiro fi e abrange tudo até o caractere de aspas duplas que começa com "SECOND MISTAKE .

Então, bash pode analisar toda a bagunça, embora de forma inadequada do ponto de vista humano. Acontece que, como 1 não equivale numericamente a 0, todo o bloco de código, de /bin/echo "HERE IS MISTAKE a fi após "SECOND MISTAKE , não é executado. Portanto, a (aparente) string SECOND MISTAKE é analisada corretamente, como um possível comando, mas bash nunca tenta executá-la, portanto, não vemos um erro sobre SECOND: command not found ou qualquer outra coisa.

Apenas para resumir, aspas faltantes em duas linhas fazem com que bash analise o código como a cláusula "true" de um único if-then-fi , mas a condição é falsa, portanto bash nunca tenta executar o que o olho humano vê como um mau comando, e não dá um erro de sintaxe relevante.

    
por 25.10.2015 / 21:44