Actualizar
Alguien en la lista de correo bug-bash ha confirmado que se trata de un error.
Si alguien está interesado, hay una solución disponible en la última versión de commit to devel branch .
Mientras
bash -c 'echo "${1##*""}"' _ bar
imprime una línea vacía,
bash -c 'echo "${1##*"${1##*}"}"' _ bar
impresiones bar
.
No entiendo esto ${1##*}
se expande a una cadena vacía, por lo que "${1##*}"
debe tratarse tal como ""
está, pero parece que bash no lo cree así.
Parece haber un consenso sobre esto entre otras sh
implementaciones 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 (con o sin --posix
) es el único que no se ajusta a eso:
$ bash -c 'echo "${1##*"${1##*}"}"' _ bar
bar
Y sin cosas de procesamiento de subcadenas, el comportamiento es el esperado:
$ bash -c 'echo "${1##*"${1+}"}"' _ bar
$ bash -c 'echo "${1##*"${2}"}"' _ bar
$ bash -c 'echo "${1##*"${2}"}"' _ bar ''
$
Realmente me pregunto si hay una explicación para esto, que no pude encontrar en el manual. ¿Es esto un error o una mala interpretación del estándar? ¿Está este comportamiento documentado en alguna parte?
PD: Sé que una solución rápida es quitar el PE interno, pero eso no responde a mi pregunta y puede dar lugar a resultados no deseados con cadenas que contienen caracteres especiales.
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
. Mientras que echo "\${BASH##*"${BASH##*}"}"
-> ${BASH##*}
y eval echo "\${BASH##*"${BASH##*}"}"
-> en blanco.
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
imprime una cadena vacía