Zwykle możemy ~/.bashrc
za pomocą tego polecenia pobrać plik źródłowy
source ~/.bashrc
ale jeśli napiszę to w skrypcie powłoki i wykonam, nic się nie stanie. Dlaczego?
Czy jest na to jakiś sposób?
Mój skrypt:
#!/bin/bash
chmod a+x ~/.bashrc
source ~/.bashrc
Próbowałem także .
(kropka) zamiast source
. Ten sam wynik.
source ~/.bashrc
w powłoce, którą chcesz zmienić środowisko. Nie możesz tego zmienić w innym procesie. Może (globalnie) dodanie tego aliasu może być częścią procesu instalacji GUI.Twój
.bashrc
rozpoczyna się zwykle:Ponieważ twój skrypt nie ma ustawionego PS1 (ponieważ nie jest interaktywny), nie resetuje ścieżki, ponieważ kończy się wcześnie. Aby zademonstrować, zmodyfikuj skrypt:
pozwoli to teraz twoim skryptom na pracę z nowym
.bashrc
. Uwaga: po zakończeniu skryptu env zostanie ustawione na to, co było przed uruchomieniem skryptu. Zmiany zostaną odzwierciedlone przy następnym uruchomieniu terminala.źródło
.bashrc
używa bardziej niezawodnego sposobu sprawdzenia, czy powłoka jest interaktywna./etc/bash.bashrc
wciąż ma test PS1.Próbować:
To powinno przeładować ~ / .bashrc, ~ / .bash_aliases itp.
źródło
source
ale niszczy wszelkie zmienne i takie, które użytkownik ustawił ręcznie - co może, ale nie musi, czego chcesz.exec bash
, jak rozumiem to polecenie po będzie nadal w tych samych ustawieniach basha, co wcześniej?Chcę uzupełnić odpowiedź Raviego :
To zachowanie jest specyficzne dla Ubuntu (i prawdopodobnie większości pochodnych dystrybucji), ponieważ domyślny
~/.bashrc
plik zaczyna się od zwarcia, Ubuntu 18.04, na przykład:Spowoduje to zatrzymanie oceny pliku, jeśli jest on uruchomiony w nieinteraktywnej powłoce, co ma miejsce w przypadku skryptu, ponieważ wszystkie skrypty są uruchamiane w nieinteraktywnej powłoce , a następnie każdy plik
source
odziedziczy tę właściwość.eval
włamać sięDowiedziałem się brzydkiego włamania do obejścia Ubuntu, używając
eval
zamiastsource
:Po prostu pomija kilka pierwszych wierszy i ocenia resztę,
~/.bashrc
więc reszta jest oceniana i modyfikuje bieżące wykonanie.Pamiętaj, że jest to magiczna liczba i może nie działać w różnych wersjach Ubuntu; ale może być dobrym rozwiązaniem, jeśli tworzysz skrypty dla mniej lub bardziej znanych systemów.
Bardziej wymyślne rozwiązanie może obejmować użycie wyrażenia regularnego do kierowania na określone bity, które zatrzymują ocenę.
Alternatywa Shebang
Inną alternatywą, która może działać lepiej w niektórych scenariuszach, jest zmuszanie skryptu do działania w interaktywnej powłoce poprzez dodanie flagi w shebang :
Pamiętaj o kilku rzeczach:
#!/usr/bin/env bash
formularza, ale ten sposób nie można uruchomić powłokę z argumentami .-i
ma swój własny zestaw konsekwencji, między innymi programy będą monitować o interakcję użytkownika i zwykle nie jest to przeznaczone dla skryptów, na przykład instalowaniedeb
pakietów może zatrzymać skrypt podpkg configure
wyświetleniu monitu .set -i
iset +i
włączać i wyłączać tę funkcję tam, gdzie jej potrzebowałem, ale to nie działa .źródło
Żadna z pozostałych metod nie działała dla mnie [
source /path/to/file
vs. ./path/to/file
, alias itp.], Dopóki dzięki temu samouczkowi nie stwierdziłem, że przy użyciu:#!/usr/bin/env bash
szulerniazamiast prostszego
#!/usr/bin/env
pozwala argumentom przekazać tłumacza, co myślę, że jest tutaj kluczem - zobacz ten dokument, aby uzyskać więcej informacji.W każdym razie, jeśli polecenia źródłowe w jakiejkolwiek formie nie działają, spróbuj sprawdzić swój shebang, to może być problem :)
źródło