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

36

Em /etc/profile , vejo isto:

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 significa ${-#*i} . Não consigo encontrar uma definição de expansão de parâmetro iniciando ${- .

    
por Pete 13.05.2014 / 18:10

2 respostas

40

$- é sinalizadores de opções atuais definidos pelo próprio shell, em invocação ou usando o comando set builtin:

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

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

${parameter#[word]}

Remove Smallest Prefix Pattern. The word shall be expanded to produce a pattern. The parameter expansion shall then result in parameter, with the smallest portion of the prefix matched by the pattern deleted. If present, word shall not begin with an unquoted '#'.

${parameter##[word]}

Remove Largest Prefix Pattern. The word shall be expanded to produce a pattern. The parameter expansion shall then result in parameter, with the largest portion of the prefix matched by the pattern deleted.

Portanto, ${-#*i} remove a string mais curta até o primeiro caractere i :

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

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

    
por 13.05.2014 / 18:24
23

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

$ echo $-
himB

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

#*i significa: Exclua (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 há um i no valor da variável $- , ou seja, verifica se o shell é interativo.

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

case $- in
  *i*) ...;;
  *) ...;;
esac
    
por 13.05.2014 / 18:17