A linha primeiro usa expr para:
- Corresponde o valor de
$newProgà expressão regular básica.* -> \(.*\)$(ancorado em ambas as extremidades). Isso é qualquer coisa com->. - Defina
newProgcomo a parte do valor original correspondido pela subexpressão de captura escrito entre parênteses (a parte depois de->).
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 .