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
newProg
como 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
.