2016-11-22 3 views
3

Первое в моем файле Bashrc является это выражение:Нужна помощь в понимании странного выражения Bashrc

# If not running interactively, don't do anything 
case $- in 
    *i*) ;; 
     *) return;; 
esac 

Может кто-нибудь объяснить, что это значит?

все эти символы делают его очень трудным для Google, и нет никакого эквивалента Haskell «hoogle» для bash, поэтому я могу искать выражения символов.

Предполагаемое поведение похоже на это.

nonsourced=0; 

# if sourced, 
if [[ "$0" == "$BASH_SOURCE" ]]; then 
    nonsourced=1; 
else 
    nonsourced=0; 
fi 

echo "nonsourced? $nonsourced"; 


case $- in 
    *i*) 
     # this case is entered if "$-" contains "i". 
     if [[ "$nonsourced" -eq "0" ]]; then 
      echo "1. " "$-"; 
     fi 
     ;; # leave case? 
    *) # this case is entered in all other cases. 
     if [[ "$nonsourced" -eq "0" ]]; then 
      echo "2. " "$-"; 
      return 
     else 
      # cannot return from nonsourced, use exit. 
      echo "avoided return from nonsourced #2"; 
      exit 0; 
     fi 
     ;; # leave case? 
esac 

echo "3"; 
+0

'*)' - это «по умолчанию», интересная ссылка: http://www.linux.org/threads/case-statement-in-bash-scripts.5602/ (я ​​искал «звездочку для bash») –

+0

Вы можете попробовать symbolhound.com для поиска со строками, содержащими символы. – meatspace

+0

Зачем вам нужно google? Разве вы не знаете, где находится руководство bash? http://www.gnu.org/software/bash/manual/html_node/index.html – Barmar

ответ

2

Может кто-нибудь объяснить, что это значит?

  • $- Список опций, установленных в оболочке в момент оценки.

    Когда оболочка (Баш) запускает его принимает некоторые опции:

    LESS = + '/^* OPTIONS угодник Баш

    Все варианты оболочки односимвольных документированных в описании команда set builtin может использоваться как опции при вызове оболочки. Кроме того, bash интерпретирует следующие варианты при его вызове:

    Одним из таких вариантов является -i. Поэтому вызов bash как bash -i … должен [a] триггер этой опции внутри [a] оболочка.

    [a] Я говорю, что должен, так как для обеспечения эффективной интерактивной оболочки требуются и другие условия.Кроме того, интерактивная оболочка может быть запущена просто писать bash в терминале (не -i опции используется)

    [б] Путь напечатать некоторые параметры, которые были установлены на с echo $-

  • *i*) ;; если строка из $- содержит i, если да, ничего не делайте.

  • *) return;; На любом другом значении $- возвращения (выйти сценарий [с]).

    [c] Пожалуйста, read this answer for return vs. exit.

В целом, это делает то, что комментарий говорит:

# If not running interactively, don't do anything

Или с более четкой формулировкой:

# If running interactively, exit[D].

[d] Возможно, более целесообразно использовать слово return вместо exit, но идея чище, я считаю.

Обратите внимание, что существует довольно подобная конструкция с $PS1 (используется в /etc/bash.bashrc и повторяется в ~/.bashrc в системах Debian не на основе, например):

# If not running interactively, don't do anything 
[ -z "$PS1" ] && return 

Что касается задачи нахождения символов:

> all these symbols make it really hard to google 

, даже если он не охватывает так много страниц, SymbolHound может быть он Здесь.

If we try it

мы find this

Который четко объясняет, что вы просите.

2

Смотрите documentation for Bash variables:

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

Звездочки в моделях случае являются подстановочные, поэтому в основном все дело говорит «если есть i [как интерактивные] где-то в аргументах, дальше, иначе вернуть».

+0

Как установить $/опции? они не являются аргументами, поскольку 'echo $ -;' script всегда говорит hB. – Dmitry

+0

Я думаю, что он создан внутренне Bash, вероятно, это также и то, почему это безопасно для «i» таким простым способом. Я попытался найти нужную часть в исходном коде, но не удалось. – zoul

+0

Возвращение работает, потому что предполагается, что оно получено правильно? return не может работать вне исходных контекстов/функций, и он не включен в функцию. – Dmitry

0

$- перечислены текущие варианты оболочки.

Два случая: присутствует ли в этом списке вариантов интерактивный флаг -i.

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