Dlaczego nie ma shebang w .bashrc / .bash_profile?


22

Proste zapytanie: Właśnie zdałem sobie sprawę, że nigdy nie widziałem shebang na szczycie .bashrcskryptu, co prowadzi mnie do wniosku, że system używa domyślnej powłoki do pozyskiwania jej podczas logowania ( ${SHELL}). Zastanawiam się, dlaczego tak jest, tj. Czy uważa się za zły nawyk używanie czegoś innego niż domyślna powłoka do uruchamiania skryptu logowania.


1
Jest powód, dla którego nazywa się bash rc ...
Ajedi32,

Odpowiedzi:


28

.bashrci NIE.bash_profile są skryptami. Są to pliki konfiguracyjne, które są pobierane za każdym razem, gdy są wykonywane na jeden z dwóch sposobów:bash

  • interaktywny
  • Zaloguj Się

Sekcja WYWOŁANIE strony podręcznika bash jest nowością.

Logowanie powłoka jest jeden, którego pierwszy znak argumentu jest zerowy -, lub jeden uruchomiony z --loginopcją.

Interaktywna powłoka jest jeden uruchomiony bez argumentów nieopcyjnych i bez -copcji, których standardowe wejście i błędów są podłączone do zacisków (jak określono isatty(3)), albo jeden uruchomiony z -i opcją. PS1 jest ustawiony i $-obejmuje i, jeżeli bashjest interaktywny, dzięki czemu skrypt lub plik startowy, aby przetestować ten stan.

Poniższe akapity opisują sposób bashwykonywania plików startowych. Jeśli któryś z plików istnieje, ale nie można go odczytać, bash zgłasza błąd. Tyldy są rozwijane w nazwach plików, jak opisano poniżej w Rozbudowa tyld w sekcji ROZSZERZENIE .

Kiedy bash jest wywoływany jako interaktywna powłoka logowania lub jako nieinteraktywna powłoka z --loginopcją, najpierw czyta i wykonuje polecenia z pliku /etc/profile, jeśli plik istnieje. Po przeczytaniu tego pliku, szuka ~/.bash_profile, ~/.bash_logini ~/.profile, w tej kolejności, a odczytuje i wykonuje polecenia z pierwszego, który istnieje i jest czytelny. --noprofileOpcja może być stosowany, gdy powłoka jest uruchamiany w celu zahamowania tego zachowania.

Po wyjściu z powłoki logowania bash czyta i wykonuje polecenia z pliku ~/.bash_logout, jeśli istnieje.

Po uruchomieniu interaktywnej powłoki, która nie jest powłoką logowania, bash czyta i wykonuje polecenia z ~/.bashrc, jeśli plik istnieje. Można temu zapobiec, używając tej --norcopcji. Ta --rcfile file opcja wymusi na bashu czytanie i wykonywanie poleceń z pliku zamiast ~/.bashrc.

Możesz kontrolować, kiedy zostaną załadowane za pomocą przełączników wiersza poleceń, --norcoraz --noprofile. Możesz również zastąpić lokalizację, z której zostaną załadowane za pomocą --rcfileprzełącznika.

Jak wspomnieli inni, możesz naśladować sposób ładowania tych plików za pomocą source <file>polecenia lub . <file>polecenia.

Najlepiej pomyśleć o tej funkcjonalności w następujący sposób:

  1. bash zaczyna się w czystym środowisku
  2. bash następnie otwiera jeden z tych plików (w zależności od tego, jak został wywołany jako interaktywny lub login, a następnie ...
  3. ... linia po linii wykonuje każde z poleceń w pliku ...
  4. po zakończeniu daje kontrolę w formie monitu, czekając na dane wejściowe

Metody wywoływania

Wydaje się, że ten temat pojawia się co jakiś czas, więc oto krótki ściągawka różnych sposobów wywoływania bashi tego, co one skutkują. UWAGA: Aby pomóc, dodałem komunikaty „sourced $ HOME / .bashrc” i „sourced $ HOME / .bash_profile ”do odpowiednich plików.

podstawowe połączenia

  1. bash -i

    $ bash -i
    sourced /home/saml/.bashrc
  2. bash -l

    $ 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

    UWAGA: Zauważ, że -cprzełącznik nie źródło żadnego pliku!

wyłączenie odczytu plików konfiguracyjnych

  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

Więcej ezoterycznych sposobów na wywołanie bash

  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$ 

Te zawiodły

  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

Prawdopodobnie jest ich więcej, ale masz rację, mam nadzieję ...

Co jeszcze?

Na koniec, jeśli jesteś tak zafascynowany tym tematem, że chcesz przeczytać / zbadać więcej na ten temat, gorąco polecam przejrzenie Przewodnika dla początkujących Bash, w szczególności sekcji: 1.2. Zalety Bourne Again SHell . Różne podrozdziały w tym podrozdziale, „1.2.2.1. Wywołanie do „1.2.2.3.3. Interaktywne zachowanie powłoki” wyjaśniają niewielkie różnice poziomów między różnymi sposobami wywoływania bash.


@amphibient - przepraszam, że wymknęło się spod kontroli, mam nadzieję, że ludzie docenią jego wartość i nie ukarzą go negatywnymi ocenami. Dzięki temu możemy teraz odwoływać się do tego w innej odpowiedzi na późniejszym etapie. 8-). Zastanawiałem się nad zrobieniem stołu, żeby to pokazać, ale byłoby to szalone 8-).
slm

Czy faktycznie je przetestowałeś? Kiedyś próbowałem śledzić to, co robi moja bash w ściskaniu i nie zachowywało się to tak, jak sugeruje instrukcja
Bananguin

@Bananguin - każde z tych poleceń było uruchamiane przeze mnie i to jest wynik, który został wygenerowany poniżej poleceń. Jedyną potencjalną „rzeczą” w mojej konfiguracji może być to, że moja .bash_profilezawiera linię do źródła .bashrc. Ale uważam, że jest to bardzo typowe dla konfiguracji.
slm

To może być subiektywne, ale nie powiedziałbym tego .bashrci .bash_profilenie są skryptami . IMHO to skrypty specjalnego przeznaczenia, które są domyślnie pozyskiwane podczas inicjacji bash lub jawnie, gdy trzeba zastosować ich modyfikacje. Nie tylko konfigurują środowisko bash (zmienne, funkcje, aliasy ...) zgodnie z oczekiwaniami z plików konfiguracyjnych. Mogą wykonywać dowolne czynności, jak w typowych skryptach. Na przykład mogą rozpocząć różne działania, takie jak zadania w tle, zapisywać zapisy w dzienniku, inicjować niektóre programy itp. W każdym razie dziękuję za szczegółowe podsumowanie!
pabouk

Ta odpowiedź jest nawet lepsza niż jakiekolwiek odpowiedzi tutaj stackoverflow.com/questions/415403/… !
Jacob Tomlinson

13

.bashrcskrypty są uruchamiane tylko bashsame. Nie są wolnostojące i nie mają być wykorzystywane execprzez system. (W rzeczywistości na ogół nie są one oznaczone jako pliki wykonywalne i, jak mówisz, nie mają linii shebang).

Takie skrypty mają być oznaczeniami sourced, ponieważ zwykle zmieniają zmienne środowiskowe ( $PATHna przykład), które powinny pozostać po zakończeniu skryptu. Tak więc naprawdę nie ma sensu próbować wykonać jednego w podpowłoce.


5

Oprócz innych odpowiedzi, pamiętaj, że jeśli chcesz, nic nie zabrania umieszczania shebang na początku tych plików konfiguracyjnych.

To nie zaszkodzi pozyskiwaniu ich przez skorupkę, ponieważ shebang będzie przetwarzany jak zwykły komentarz, tj. Ignorowany.

Może to pomóc redaktorom korzystającym z podświetlania składni dowiedzieć się, jakiego języka programowania używa się w pliku.

Zauważ jednak, że niektórzy redaktorzy vimoferują alternatywne sposoby, takie jak modeliny dla tych ostatnich. tzn. zawsze możesz umieścić linie trybu na końcu ~/.bashrci ~/.bash_profiletak:

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

1
Przyjęta odpowiedź z @slm powyżej jest świetna, ale tego właśnie szukałem, jeśli chodzi o dodanie shebang na początku mojego .bash_profilena zalecenie ShellCheck.
jlucktay

1

Czytam to wszędzie, nie wiem gdzie dokładnie, ale to prawda

Podręcznik Bash jest nieco mylący w tym obszarze, ale Bash nie wykorzenia ~ / .bash_profile jak skrypt powłoki. Odczytuje plik, a następnie wykonuje zawarte w nim polecenia (możesz zrobić coś podobnego, uruchamiając plik źródłowy ~ / .bash_profile).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.