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

37

No /etc/profileque vejo isso:

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

O que ${-#*i}significa isso ? Não consigo encontrar uma definição de início de expansão de parâmetro ${-.

Pete
fonte

Respostas:

40

$-são os sinalizadores de opção atuais definidos pelo próprio shell, na chamada ou usando o setcomando builtin:

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

"${-#*i}"é uma sintaxe para remoção de string: (da documentação do POSIX )

$ {parâmetro # [palavra]}

Remova o menor padrão de prefixo. A palavra deve ser expandida para produzir um padrão. A expansão do parâmetro resultará em parâmetro, com a menor porção do prefixo correspondida pelo padrão excluída. Se presente, a palavra não começará com um '#' não citado.

$ {parâmetro ## [palavra]}

Remova o maior padrão de prefixo. A palavra deve ser expandida para produzir um padrão. A expansão do parâmetro resultará em parâmetro, com a maior parte do prefixo correspondida pelo padrão excluída.

Portanto, ${-#*i}remova a corda mais curta até o primeiro icaractere:

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

No seu caso, if [ "${-#*i}" != "$-" ]verificando se o seu shell é interativo ou não.

cuonglm
fonte
23

Há um parâmetro de shell $-. No meu caso:

$ echo $-
himB

${-}é o mesmo que $-exatamente ${foo}igual é o mesmo que $foo.

#*isignifica: Excluir (o mínimo possível; não faz diferença aqui) desde o início do valor da variável até (incluindo) o primeiro i.

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

Em outras palavras: [ "${-#*i}" != "$-" ]verifica se existe um ivalor na $-variável, ou seja, verifica se o shell é interativo.

Em outras palavras, é uma maneira complicada e não-Bourne compatível de escrever:

case $- in
  *i*) ...;;
  *) ...;;
esac
Hauke ​​Laging
fonte
4
Ele é compatível com POSIX , no entanto.
grawity