¿Qué significa "${-#*i}" != "$-" ¿significa?

¿Qué significa "${-#*i}" != "$-" ¿significa?

En /etc/profileveo esto:

for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done

Que ${-#*i}significa. No puedo encontrar una definición de inicio de expansión de parámetros ${-.

Respuesta1

$-son los indicadores de opción actuales establecidos por el propio shell, al invocarlo o usando el setcomando incorporado:

$ echo $-
himBH
$ set -a
$ echo $-
ahimBH

"${-#*i}"es la sintaxis para la eliminación de cadenas: (dedocumentación POSIX)

${parámetro#[palabra]}

Eliminar el patrón de prefijo más pequeño. La palabra se ampliará para producir un patrón. La expansión del parámetro dará como resultado un parámetro, con la porción más pequeña del prefijo que coincida con el patrón eliminada. Si está presente, la palabra no comenzará con un '#' sin comillas.

${parámetro##[palabra]}

Eliminar el patrón de prefijo más grande. La palabra se ampliará para producir un patrón. La expansión del parámetro dará como resultado un parámetro en el que se eliminará la mayor parte del prefijo que coincida con el patrón.

Entonces ${-#*i}elimine la cadena más corta hasta el primer icarácter:

$ echo "${-#*i}"
mBH

En su caso, if [ "${-#*i}" != "$-" ]comprobar si su shell es interactivo o no.

Respuesta2

Hay un parámetro de shell $-. En mi caso:

$ echo $-
himB

${-}es lo mismo que $-exactamente como ${foo}es lo mismo que $foo.

#*isignifica: Eliminar (lo menos posible; aquí no hace ninguna diferencia) desde el principio del valor de la variable hasta (incluido) el primero i.

$ echo "${-#*i}"
mB

En otras palabras: [ "${-#*i}" != "$-" ]verifica si hay un ivalor en la $-variable, es decir, verifica si el shell es interactivo.

En otras palabras, es una forma complicada y no compatible con Bourne de escribir:

case $- in
  *i*) ...;;
  *) ...;;
esac

información relacionada