No seguinte caso, as saídas de basename "$x"
e echo "${x##*/}"
não são diferentes:
$ x=xxx/yyy ; basename "$x" ; echo "${x##*/}"
yyy
yyy
Em quais casos (se houver) as saídas de basename "$x"
e echo "${x##*/}"
diferem?
No seguinte caso, as saídas de basename "$x"
e echo "${x##*/}"
não são diferentes:
$ x=xxx/yyy ; basename "$x" ; echo "${x##*/}"
yyy
yyy
Em quais casos (se houver) as saídas de basename "$x"
e echo "${x##*/}"
diferem?
A especificação de
basename
inclui o seguinte:Seu
${x##*/}
é expandido de acordo com esta especificação :Então basicamente faz o que a etapa número 5 na especificação
basename
deve fazer. Você está perguntando sobrebasename "$x"
(em vez debasename "$x" suffix
), então a etapa número 6 é irrelevante. Isto significa que (quase*) todas as diferenças entrebasename "$x"
eecho "${x##*/}"
devem, portanto, vir dos passos 1 a 4. Exemplos:*Escrevi “quase” porque existem poucas possibilidades adicionais. Entre eles:
basename
pode interpretar argumentos como opções e tambémecho
possivelmente suporta algumas opções (pelo POSIX não deve; mas o GNUecho
faz,echo
os componentes internos em vários shells sim). Isso leva a diferenças de seu próprio tipo:Consulte O que
--
significa (traço duplo / hífen duplo)? e Por que éprintf
melhor queecho
?echo
geralmente é um shell interno, masbasename
geralmente é um programa externo; então se você quebrar seu$PATH
...