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

37

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 ${-.

Pete
fuente

Respuestas:

40

$-son las banderas de opciones actuales establecidas por el propio shell, en invocación o usando el setcomando incorporado:

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

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

$ {parámetro # [palabra]}

Eliminar el patrón de prefijo más pequeño. La palabra se expandirá para producir un patrón. La expansión del parámetro dará como resultado el parámetro, con la porción más pequeña del prefijo emparejada por el patrón eliminado. 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 expandirá para producir un patrón. La expansión del parámetro dará como resultado el parámetro, con la porción más grande del prefijo emparejada por el patrón eliminado.

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

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

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

Cuonglm
fuente
23

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

$ echo $-
himB

${-}es lo mismo que $-exactamente igual ${foo}es igual a $foo.

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

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

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

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

case $- in
  *i*) ...;;
  *) ...;;
esac
Hauke ​​Laging
fuente
44
Sin embargo, es compatible con POSIX .
Grawity