Atualizar
Alguém na lista de discussão bug-festa tem confirmou este é um bug.
Se alguém estiver interessado, uma correção está disponível na confirmação mais recente para o desenvolvimento da ramificação .
Enquanto
bash -c 'echo "${1##*""}"' _ bar
imprime uma linha vazia,
bash -c 'echo "${1##*"${1##*}"}"' _ bar
impressões bar
.
Eu não entendo isso. ${1##*}
se expande para uma string vazia, então "${1##*}"
deve ser tratado como ""
está, mas parece que o bash não pensa assim.
Parece haver um consenso sobre isso entre outras sh
implementações populares :
$ sh -c 'echo "${1##*"${1##*}"}"' _ bar
$ ash -c 'echo "${1##*"${1##*}"}"' _ bar
$ dash -c 'echo "${1##*"${1##*}"}"' _ bar
$ ksh -c 'echo "${1##*"${1##*}"}"' _ bar
$ ksh93 -c 'echo "${1##*"${1##*}"}"' _ bar
$ mksh -c 'echo "${1##*"${1##*}"}"' _ bar
$ posh -c 'echo "${1##*"${1##*}"}"' _ bar
$ yash -c 'echo "${1##*"${1##*}"}"' _ bar
$ zsh -c 'echo "${1##*"${1##*}"}"' _ bar
$
bash (com ou sem --posix
) é o único que não está em conformidade com isso:
$ bash -c 'echo "${1##*"${1##*}"}"' _ bar
bar
E sem as coisas de processamento de substring, o comportamento é o esperado:
$ bash -c 'echo "${1##*"${1+}"}"' _ bar
$ bash -c 'echo "${1##*"${2}"}"' _ bar
$ bash -c 'echo "${1##*"${2}"}"' _ bar ''
$
Eu realmente me pergunto se existe uma explicação para isso, que não encontrei no manual. Isso é um bug ou uma interpretação incorreta do padrão? Esse comportamento está documentado em algum lugar?
PS: Eu sei que uma solução rápida é citar o PE interno, mas isso não responde à minha pergunta e pode levar a resultados indesejados com seqüências contendo caracteres especiais.
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
imprime "bar"
4.4.12(3)-release
, echo "${BASH##*"${BASH##*}"}"
-> /bin/bash
. Enquanto echo "\${BASH##*"${BASH##*}"}"
-> ${BASH##*}
e eval echo "\${BASH##*"${BASH##*}"}"
-> estiver em branco.
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
imprime uma cadeia vazia #