Cosa significa "$ {- # * i}"! = "$ -"?


37

In /etc/profilevedo questo:

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

Cosa ${-#*i}significa Non riesco a trovare una definizione di espansione di un parametro che inizia ${-.

Risposte:


40

$-sono i flag delle opzioni correnti impostati dalla shell stessa, su invocazione o usando il setcomando incorporato:

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

"${-#*i}"è la sintassi per la rimozione di stringhe: (dalla documentazione POSIX )

$ {Parametro # [parola]}

Rimuovi modello prefisso più piccolo. La parola deve essere espansa per produrre uno schema. L'espansione del parametro deve quindi comportare il parametro, con la parte più piccola del prefisso abbinata al modello cancellato. Se presente, la parola non deve iniziare con un '#' non quotato.

$ {Parametro ## [parola]}

Rimuovi modello prefisso più grande. La parola deve essere espansa per produrre uno schema. L'espansione del parametro deve quindi comportare il parametro, con la maggior parte del prefisso abbinata al modello eliminato.

Quindi ${-#*i}rimuovi la stringa più corta fino al primo icarattere:

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

Nel tuo caso, if [ "${-#*i}" != "$-" ]controlla se la tua shell è interattiva o meno.


23

C'è un parametro di shell $-. Nel mio caso:

$ echo $-
himB

${-}è uguale a $-esattamente come ${foo}è uguale a $foo.

#*isignifica: Elimina (il meno possibile; qui non fa differenza) dall'inizio del valore della variabile fino a (incluso) il primo i.

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

In altre parole: [ "${-#*i}" != "$-" ]controlla se c'è un ivalore nel valore della $-variabile, cioè controlla se la shell è interattiva.

In altre parole, è un modo contorto e non compatibile con Bourne di scrivere:

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

4
Si è compatibile con POSIX , però.
Grawity
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.