O que esta expr faz em um script de shell?

3

O que o seguinte faz exatamente?

newProg='expr "${newProg}" : ".* -> \(.*\)$"'   
if expr "x${newProg}" : 'x/' >/dev/null; then    
   prog="${newProg}"     
else    
    progdir='dirname "${prog}"'   
    prog="${progdir}/${newProg}"    
fi   
    
por Jim 15.07.2017 / 10:40

1 resposta

5

A linha primeiro usa expr para:

A semântica de correspondência gulosa é tal que sempre captura e produz a última correspondência última , portanto, nunca há um -> na saída.

Isto, por exemplo, analisa a saída de ls -l em um symlink para encontrar o alvo (dados de nomes de arquivos bem comportados, etc, advertências habituais).

A linha segunda usa expr novamente para verificar se o novo valor de newProg começa com / , ou seja, representa um caminho absoluto.

No caso em que ocorre, prog é definido apenas para esse valor. Caso contrário, prog é definido como um caminho relativo calculado usando dirname on $prog , uma variável não definida neste snippet. O efeito presumivelmente será construir um caminho relativo àquele local original.

Se você está alvejando apenas um shell ou ambiente mais capaz do que o POSIX puro, é provável que haja uma maneira mais confiável de fazer isso do que expr . readlink é um comando muito comumente disponível também, o que economizaria na análise de ls .

    
por 15.07.2017 / 11:02