Чому немає shebang в .bashrc / .bash_profile?


22

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


1
Є причина, чому його називають bash rc ...
Ajedi32

Відповіді:


28

.bashrcі НЕ.bash_profile є сценаріями. Вони є конфігураційним файлом, який отримується щоразу, коли виконується одним із двох способів:bash

  • інтерактивний
  • вхід

Розділ ІНВОЦІАЦІЇ на сторінці bash man - це те, що є релевантним.

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

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

У наступних параграфах описано, як bashвиконуються файли запуску. Якщо будь-який з файлів існує, але його неможливо прочитати, bash повідомляє про помилку. Tildes розкладаються в іменах файлів , як описано нижче в розділі тильди в РОЗШИРЕННЯ розділі.

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

Коли оболонка входу виходить, bash зчитує та виконує команди з файлу ~/.bash_logout, якщо він існує.

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

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

Як згадували інші, ви можете імітувати, як ці файли завантажуються за допомогою використання source <file>команди або використання . <file>команди.

Краще подумати про цю функціональність так:

  1. Баш починається з голого середовища
  2. потім bash відкриває один з цих файлів (залежно від того, як його викликали як інтерактивного або входу, а потім ...
  3. ... рядок за рядком виконує кожну з команд у файлі ...
  4. коли завершене дає контроль у вигляді підказки, чекаючи введення

Методи виклику

Ця тема, здається, з'являється раз у раз, тому ось невеликий чіткий лист про різні способи викликати bashта до чого вони призводять. ПРИМІТКА. Щоб допомогти, я додав повідомлення "джерело $ HOME / .bashrc" та "джерело" $ 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 -or- bash -li

    $ 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 --norc
    bash-4.1$ 
  2. bash --noprofile

    $ bash --noprofile
    sourced /home/saml/.bashrc
  3. bash --norc -i

    $ bash --norc -i
    bash-4.1$ 
  4. bash --norc -l

    $ 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 -or- 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 SHell . Різні підрозділи під цим пунктом, "1.2.2.1. Заклик" через "1.2.2.3.3. Інтерактивна поведінка оболонки" пояснюють низькі відмінності на рівні між різними способами, на які можна викликати bash.


@amphibient - вибачте, що це трохи вийшло з ладу, сподіваємось, люди оцінять його цінність і не покарають її протилежно. Із цим ми можемо тепер посилатися на це в іншій відповіді вниз. 8-). Я думав зробити таблицю, щоб показати це, але це було б божевільним 8-).
slm

Насправді випробували їх? Я одного разу спробував дотримуватися того, що мій баш робить у вичавлюванні, і він не веде себе так, як запропонувала інструкція
Bananguin

@Bananguin - кожна з цих команд була виконана мною, і це результат, який вироблявся нижче команд. Єдиною потенційною «річчю» у моїй установці може бути те, що мій .bash_profileвключає рядок для джерела .bashrc. Але я вважаю, що це дуже характерно для налаштувань.
slm

Це може бути суб'єктивним, але я б не сказав цього .bashrcі .bash_profileне є сценаріями . IMHO - це сценарії конкретного призначення, які неявно створюються під час ініціалізації bash або явно, коли потрібно застосувати їх модифікації. Вони не просто налаштовують середовище bash (змінні, функції, псевдоніми ...), як очікується від файлів конфігурації. Вони можуть робити будь-які дії, як у загальних сценаріях. Наприклад, вони можуть запускати різні дії, такі як фонові завдання, писати записи журналів, ініціалізувати деякі програми тощо. Все одно дякую за детальний підсумок!
pabouk

Ця відповідь навіть краща за будь-яку відповідь тут stackoverflow.com/questions/415403/… !
Якоб Томлінсон

13

.bashrcсценарії виконуються лише bashсамі по собі. Вони не є вільними, і система їх не планує execвикористовувати. (Насправді вони, як правило, не позначені виконуваним, і, як ви кажете, у них немає рядка shebang.)

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


5

Крім інших відповідей, зауважте, що якщо ви цього хочете, ніщо не забороняє вам ставити шебанг на початку цих файлів конфігурації.

Це не зашкодить снарядам снарядів, оскільки шебанг буде оброблятися як звичайний коментар, тобто ігнорується.

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

Зверніть увагу, що деякі редактори, як, наприклад, vimпропонують альтернативні способи, як моделі для останнього. тобто ви завжди можете ставити рядки режиму в кінці ~/.bashrcі ~/.bash_profileтак:

...
<code in ~/.bashrc>
...
# vim: ft=sh :

1
Прийнята відповідь від @slm вище є чудовою, але це те, що я шукав, що стосується додавання shebang на початок мого .bash_profileза рекомендацією ShellCheck.
jlucktay

1

Я читаю це де завгодно, не знаю, де саме, але це правда

Посібник Bash трохи заплутаний у цій області, але Bash не має eXecute ~ / .bash_profile, як сценарій оболонки. Він читає файл, а потім виконує команди в ньому (Ви можете зробити щось подібне, запустивши source ~ / .bash_profile).

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