Що означає "$ {- # * i}"! = "$ -"?


37

У цьому /etc/profileя бачу:

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

Що ${-#*i}означає. Я не можу знайти визначення початкового розширення параметра ${-.

Відповіді:


40

$-є поточними прапорами опцій, встановленими самою оболонкою, при виклику або за допомогою setвбудованої команди:

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

"${-#*i}"є синтаксисом для видалення рядка: (з документації POSIX )

$ {параметр # [слово]}

Видаліть найменший шаблон префікса. Слово слід розширити, щоб створити візерунок. Потім розширення параметра приводить до параметра, при цьому найменша частина префікса, узгоджена з шаблоном, видаляється. Якщо воно присутнє, слово не повинно починатися з котирування "#".

$ {параметр ## [слово]}

Видаліть найбільший шаблон префікса. Слово слід розширити, щоб створити візерунок. Потім розширення параметра приводить до параметра, причому найбільша частина префікса збігається з шаблоном.

Тому ${-#*i}видаліть найкоротший рядок до першого iсимволу:

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

У вашому випадку if [ "${-#*i}" != "$-" ]перевіряйте, чи є ваша оболонка інтерактивною чи ні.


23

Є параметр оболонки $-. У моєму випадку:

$ echo $-
himB

${-}є те саме, що $-точно так само, як ${foo}і те саме $foo.

#*iозначає: Видалити (як можна менше; тут нічого не змінюється) від початку значення змінної до (включаючи) першого i.

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

Іншими словами: [ "${-#*i}" != "$-" ]перевіряє, чи є iзначення $-змінної, тобто перевіряє, чи оболонка інтерактивна.

Іншими словами, це складний і не Борн сумісний спосіб писати:

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

4
Це є POSIX-сумісної , однако.
grawity
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.