2013-10-09 2 views
2

В моем окне Oracle Linux, я нашел блок сценария в /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} и $-. Что это значит? И почему нужно добавить инструкцию else для перенаправления вывода? Спасибо!

ответ

8

$- является variable which stores the current options set by the shell.

${-#*i} использует удаление подстроки, чтобы удалить кратчайшее соответствие шаблону *i с начала переменной. Так, если $- имеет значение abcifOO, то ${-#*i} будет fOO. (You can read more about bash substrings here.)

Это означает, что испытание

[ "${-#*i}" != "$-" ] 

будет справедливо, если переменная $- содержит опцию i, что означает interactive mode включен.

Все это означает, что выход будет перенаправлен только на /dev/null, если вы находитесь в интерактивном режиме.

2

Что означает $- означает?

Из инструкции:

-

(. Дефис) Раскрывается в текущие флаги опций, как указано при вызове, с помощью команды набора встроенных, или те, установленные оболочки (например, вариант -i).

Когда вы работаете bashинтерактивно, то $- может exapnd на что-то вроде:

himBH 

Когда вы выполнение сценария, $- бы не i (кроме некоторых других флаги выше).

Что означает ${-#*i}?

${-#*i} Высказывание вызывает короткий матч *i с самого начала расширения $- быть удалены. (См Shell Parameter Expansion.)

Короче говоря, внутренняя if условно в примере означает, что в то время как в интерактивном режиме выполняется следующим образом:

. "$i" >/dev/null 2>&1 

и в не интерактивном режиме, следующие:

. "$i" 
4

Он проверяет, является ли оболочка интерактивной. Текущие параметры оболочки находятся в $-, и если удаление чего-либо, за которым следует i, дает другой результат, это означает, чтобыл среди флагов.

Это было бы намного более читаемым и идиоматических, хотя:

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

Кроме того, было бы лучше, чтобы сделать проверку один раз, вне цикла.

1

Просто добавьте немного больше информации о $ -. если вы пытаетесь ввести в свой терминал

[[email protected] ~]# echo $- 
himBH 

Те, кажется, оболочка «набор» значений

Snippets из info bash --index-search=set

'-h' 

Найти и запомнить (хэш) команды, как они смотрят вверх для исполнение. Эта опция включена по умолчанию.

'-m' 

Управление заданиями разрешено (* note Управление заданиями: :).

'-B' 

Оболочка будет выполнять расширение распорки (* примечание Brace расширения: :). Этот параметр включен по умолчанию.

'-H' 

Включить '!' история замещения истории (* примечание История Взаимодействие: :). Эта опция включена по умолчанию для интерактивных оболочек .

Использование +' rather than - 'приводит к отключению этих параметров. Опция также может использоваться при вызове оболочки.

Смежные вопросы