Existe uma versão do Unix em que “if” é um comando em / bin?

3

Existe ou já existiu uma versão do Unix em que o shell embutido "if" era um comando (como /bin/[ e /bin/test )?

    
por Aaron Digulla 02.03.2012 / 14:42

1 resposta

3

Altamente improvável. if não é um comando ; faz parte da sintaxe do shell sh , com diferentes regras de análise para permitir listas de comandos, aninhados if , e assim por diante.

Por exemplo, seria praticamente impossível o seguinte se if fosse um comando, pois o analisador só pararia em if test -e file; sem considerar o resto.

if test -e file; then
    echo "File exists"
else
    if touch file; then
        echo "File created"
    else
        echo "File couldn't be created"
    fi
fi

Ou isto:

if case $path in
   ~/trash/*)  false;;
   ~/*)        true;;
   /proc/*)    false;;
   *)          true;;
esac; then
   backup "$path"
else
   echo "skipping $path"
fi

A menos que você queira recorrer a coisas como citar ... muitas citações. E seria necessário reimplementar o mesmo analisador de shell if . Se você simplesmente criasse um novo imaginarysh -c <argument> , seria impossível modificar as variáveis dentro das listas de comandos.

/bin/if "test -e file" "echo \"File exists\"" "if \"touch file\" \"echo File created\" \"echo \\"File couldn\\'t be created\\"\""

(Além disso: if é na verdade um comando na linguagem de programação Tcl , e funciona exatamente como no exemplo acima, exceto com { } balanceado para citar blocos de código.)

Mas pensando duas vezes, se if fosse um comando, seria impossível modificar as variáveis dentro das listas de comandos de qualquer maneira . Qualquer coisa modificada dentro dos argumentos if seria impossível alcançar o processo principal.

Finalmente, não há absolutamente nenhuma vantagem para implementar if externamente. Nos shells, testar a condição consiste em 1) executar o comando e 2) verificar seu código de saída. Se if fosse externo, seu shell teria que fazer o mesmo assim , caso contrário, não saberia se if foi bem-sucedido ou falhou. (A mesma funcionalidade é usada também em || e && condicionais).

(além: nos primeiros protótipos do Unix, chdir era um comando externo .)

    
por 02.03.2012 / 15:04

Tags