Почему нет шебанга в .bashrc / .bash_profile?

22

Простой вопрос: я только что понял, что никогда не видел шебанга поверх .bashrcскрипта, что наводит меня на мысль, что система использует оболочку по умолчанию для получения ее при входе в систему ( ${SHELL}). Я размышляю над причинами, почему это так, то есть считается ли это плохой привычкой использовать что-то кроме оболочки по умолчанию для запуска сценария входа в систему.

amphibient
источник
1
Есть причина, по которой это называется bash rc ...
Ajedi32

Ответы:

28

.bashrcи НЕ.bash_profile являются сценариями. Это конфигурационный файл, каждый раз получаемый одним из двух способов:bash

  • интерактивный
  • авторизоваться

Раздел INVOCATION на странице руководства bash - это то, что нужно.

Войти оболочкой является один, первым символом аргумента нуля является -, или запущенным с --loginопцией.

Интерактивная оболочка один запускаются без аргументов без опций и без -cопции которого стандартного ввода и ошибок оба подключены к клеммам (как определенно isatty(3)), или один начал с -i опцией. PS1 устанавливается и $-включает в себя , iесли в bashинтерактивном режиме , что позволяет сценарий оболочки или файл запуска, чтобы проверить это состояние.

Следующие параграфы описывают, как bashвыполняются его файлы запуска. Если какой-либо из файлов существует, но не может быть прочитан, bash сообщает об ошибке. Тильды раскрываются в именах файлов, как описано ниже в разделе « Расширение тильды» в разделе « РАСШИРЕНИЕ ».

Когда bash вызывается как интерактивная оболочка входа в систему или как неинтерактивная оболочка с --loginпараметром, она сначала читает и выполняет команды из файла /etc/profile, если этот файл существует. После прочтения этого файла, он ищет ~/.bash_profile, ~/.bash_loginи ~/.profile, в таком порядке, и читает и выполняет команду из первого, который существует и читаемые. Эта --noprofileопция может использоваться, когда оболочка запускается, чтобы запретить это поведение.

При выходе из оболочки входа в систему bash читает и выполняет команды из файла ~/.bash_logout, если он существует.

Когда запускается интерактивная оболочка, которая не является оболочкой входа в систему, bash читает и выполняет команды ~/.bashrc, если этот файл существует. Это может быть запрещено с помощью --norcопции. --rcfile file Опция заставит Баш читать и выполнять команды из файла вместо ~/.bashrc.

Вы можете контролировать, когда они загружаются через ключи командной строки, --norcи --noprofile. Вы также можете переопределить расположение, куда они загружаются с помощью --rcfileкоммутатора.

Как уже упоминалось, вы можете имитировать, как эти файлы загружаются с помощью source <file>команды или . <file>команды.

Лучше думать об этой функциональности следующим образом:

  1. Bash запускается с голой средой
  2. Затем bash открывает один из этих файлов (в зависимости от того, как он был вызван как интерактивный или для входа в систему, а затем ...
  3. ... строка за строкой выполняет каждую из команд в файле ...
  4. по завершении дает управление в виде приглашения, ожидая ввода

Методы вызова

Эта тема, кажется, появляется время от времени, поэтому вот небольшая таблица различных способов вызова bashи их результатов. ПРИМЕЧАНИЕ. Чтобы помочь, я добавил сообщения «sourced $ HOME / .bashrc» и «sourced». $ HOME / .bash_profile "в соответствующие файлы.

основные звонки

  1. Баш-я

    $ bash -i
    sourced /home/saml/.bashrc
  2. Баш-л

    $ bash -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  3. Баш-ил-или- Баш-ли

    $ bash -il
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  4. bash -c "..cmd .."

    $ bash -c 'echo hi'
    hi

    ПРИМЕЧАНИЕ. Обратите внимание, что -cни один из этих файлов не был источником!

отключение файлов конфигурации от чтения

  1. Баш - Норк

    $ bash --norc
    bash-4.1$ 
  2. bash --noprofile

    $ bash --noprofile
    sourced /home/saml/.bashrc
  3. Баш - Норк -i

    $ bash --norc -i
    bash-4.1$ 
  4. Баш - Норк-л

    $ bash --norc -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  5. bash --noprofile -i

    $ bash --noprofile -i
    sourced /home/saml/.bashrc
  6. bash --noprofile -l

    $ bash --noprofile -l
    bash-4.1$ 
  7. bash --norc -i -или- bash --norc -l

    $ bash --norc -c 'echo hi'
    hi

Более эзотерические способы называть Баш

  1. bash --rcfile $ HOME / .bashrc

    $ bash -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
  2. bash --norc --rcfile $ HOME / .bashrc

    $ bash --norc -rcfile ~/.bashrc 
    bash-4.1$ 

Эти не удалось

  1. bash -i -rcfile ~ / .bashrc

    $ bash -i -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: /home/saml/.bashrc: restricted: cannot specify `/' in command names
  2. bash -i -rcfile .bashrc

    $ bash -i -rcfile .bashrc
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: .bashrc: command not found

Есть, вероятно, больше, но вы понимаете, надеюсь ...

Что-то еще?

И наконец, если вы настолько увлечены этой темой, что хотели бы прочитать / изучить ее подробнее, я настоятельно рекомендую взглянуть на Руководство по Bash для начинающих, в частности раздел 1.2. Преимущества Bourne Again Sheell . Различные подразделы этого раздела , «1.2.2.1. Вызов» через «1.2.2.3.3. Интерактивное поведение оболочки», объясняют различия на низком уровне между различными способами, которые вы можете вызывать bash.

SLM
источник
@amphibient - извините, он немного вышел из-под контроля, надеюсь, люди оценят его ценность и не накажут его отрицательными голосами. С этим здесь мы можем теперь сослаться на это в другом ответе в будущем. 8-). Я собирался сделать стол, чтобы показать это, но это было бы сумасшествием 8-).
SLM
На самом деле проверили это? Однажды я попытался проследить, что мой bash делает в сжатии, и он не совсем вел себя так, как предлагалось в руководстве
Bananguin
@Bananguin - каждая из этих команд была выполнена мной, и это вывод, который был произведен под командами. Единственная потенциальная «вещь» в моей настройке может заключаться в том, что my .bash_profileвключает строку для источника .bashrc. Но я считаю, что это очень типично для установок.
SLM
Это может быть субъективным , но я бы не сказал , что .bashrcи .bash_profileне являются скрипты . ИМХО, это скрипты специального назначения, которые неявно создаются во время инициализации bash или явно, когда вам нужно применить их модификации. Они не просто настраивают среду bash (переменные, функции, псевдонимы ...), как ожидается из файлов конфигурации. Они могут выполнять любые действия, как в обычных сценариях. Например, они могут запускать различные действия, такие как фоновые задачи, записывать записи в журнал, инициализировать некоторые программы и т. Д. В любом случае спасибо за подробное резюме!
Пабук
Этот ответ даже лучше, чем любой другой ответ здесь stackoverflow.com/questions/415403/… !
Джейкоб Томлинсон
13

.bashrcскрипты запускаются только bashсами по себе. Они не являются автономными и не предназначены для использования execсистемой. (На самом деле, они, как правило, не помечены как исполняемые, и, как вы говорите, у них нет строки Шебанга.)

Такие сценарии предназначены для sourced, так как они обычно делают такие вещи, как изменение переменных среды ( $PATHнапример), которые, как ожидается, сохранятся после завершения сценария. Поэтому было бы бессмысленно пытаться выполнить его в подоболочке.

RICi
источник
5

В дополнение к другим ответам, обратите внимание, что если вы хотите, ничто не запрещает вам помещать шебанг в начале этих файлов конфигурации.

Это не повредит поиску оболочки, так как шебанг будет обрабатываться как обычный комментарий, то есть игнорироваться.

Это может помочь редакторам, которые используют подсветку синтаксиса, чтобы выяснить, какой язык программирования используется в файле.

Обратите внимание, что некоторые редакторы, как, например, vimпредоставляют альтернативные способы, такие как модели для последнего. то есть вы всегда можете поместить строки режима в конец ~/.bashrcи ~/.bash_profileвот так:

...
<code in ~/.bashrc>
...
# vim: ft=sh :
jlliagre
источник
1
Принятый ответ от @slm выше великолепен, но это то, что я искал, в отношении добавления шебанга к началу моего .bash_profileпо рекомендации ShellCheck.
Jlucktay
1

Я читаю это где угодно, не знаю, где именно, но это правда

Руководство по Bash немного запутанно в этой области, но Bash не выполняет eXecute ~ / .bash_profile, как скрипт оболочки. Он читает файл и затем выполняет команды внутри него (вы можете сделать что-то подобное, запустив source ~ / .bash_profile).

Рахул Патил
источник