Załaduj ponownie .profile w skrypcie powłoki bash (w systemie unix)?

130

Jestem nowy w tworzeniu skryptów powłoki bash i napotkałem wyzwanie. Wiem, że mogę ponownie załadować plik „.profile”, wykonując po prostu:

. .profile

ale próbuję wykonać to samo w skrypcie bash, który piszę, i po prostu nie działa. Jakieś pomysły? Czy mogę coś jeszcze wyjaśnić?

Dzięki

Amir Rustamzadeh
źródło
Jak Ignacio wskazuje poniżej, twój skrypt działa w podpowłoce. Podpowłoka nie może modyfikować powłoki głównej (proces potomny nie może modyfikować swojego rodzica). Musisz więc „pozyskać” skrypt przy użyciu znaku „.” polecenie (które można również zapisać jako „źródło”). Więc jeśli twój skrypt chce, powiedzmy, zmodyfikować zmienne środowiskowe, musisz zrobić coś takiego jak „source myscript” lub „. Myscript” (oba mają to samo znaczenie). To zmodyfikuje środowisko twojej głównej powłoki. (Co myślę, że właśnie próbujesz zrobić, daj mi znać, jeśli to jest złe.)
bstpierre
1
Odpowiedziałem na Twoje pytanie :)
Kolob Canyon

Odpowiedzi:

195

Spróbuj tego, aby przeładować aktualną powłokę:

source ~/.profile
kofriel
źródło
1
Czy masz inne rozwiązanie? Ponieważ użycie sourcepolecenia uruchomi plik jako skrypt ... W najgorszych przypadkach, jeśli ktoś użyłby przypisania zmiennej jak MyVar="$foo$MyVar"w swoim bash_profile, to source ~/.profiledałby wynik końcowy MyVar="$foo$MyVar$MyVar", stąd$MyVar miałby później niewłaściwą wartość. (Niezależnie od złych praktyk, po prostu poproś o alternatywne rozwiązanie)
Jeffrey Mvutu Mabilama
9

Spróbuj tego:

cd 
source .bash_profile
girardengo
źródło
5

Podczas próby ponownego załadowania pliku / source ~ / .profile pojawia się kilka problemów. [Dotyczy to Ubuntu Linux - w niektórych przypadkach szczegóły poleceń będą inne]

  1. Czy uruchamiasz to bezpośrednio w terminalu czy w skrypcie?
  2. Jak uruchomić to w skrypcie?

Ogłoszenie. 1)

Uruchomienie tego bezpośrednio w terminalu oznacza, że ​​nie zostanie utworzona podpowłoka. Możesz więc użyć jednego z dwóch poleceń:

source ~/.bash_profile

lub

. ~/.bash_profile

W obu przypadkach spowoduje to zaktualizowanie środowiska o zawartość pliku .profile.

Ad 2) Możesz uruchomić dowolny skrypt basha przez wywołanie

sh myscript.sh 

lub

. myscript.sh

W pierwszym przypadku utworzy to podpowłokę, która nie będzie miała wpływu na zmienne środowiskowe twojego systemu i będą widoczne tylko dla procesu podpowłoki. Po zakończeniu polecenia podpowłoki żaden z eksportów itp. Nie zostanie zastosowany. JEST TO WSPÓLNY BŁĄD I POWODUJE WIELU DEWELOPERÓW STRATĘ CZASU.

Aby zmiany zastosowane w skrypcie odniosły skutek w środowisku globalnym, skrypt musi być uruchomiony

.myscript.sh

Komenda.

Aby upewnić się, że twój skrypt nie zostanie uruchomiony w podrzędnej półce, możesz użyć tej funkcji. (Ponownie przykład dotyczy powłoki Ubuntu)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

Mam nadzieję, że to wyjaśnia niektóre z powszechnych nieporozumień! : D Powodzenia!

twboc
źródło
4

Skrypt bash działa w osobnej podpowłoce. Aby to zadziałało, będziesz musiał również pobrać ten inny skrypt.

Ignacio Vazquez-Abrams
źródło
Nie jestem pewien (wciąż nowy w tym wszystkim), co dokładnie masz na myśli, mówiąc o „źródle” - w drugim skrypcie. Mogę to trochę rozwinąć. Jednak próbowałem: $. ~ / .profile $. / etc / profile bez powodzenia. Dziękuję bardzo.
Amir Rustamzadeh
1
@amirrustan: Twój skrypt będzie musiał pobrać .profileplik w następujący sposób: . $HOME/.profilei będziesz musiał uruchomić skrypt, również go pozyskując. Coś w rodzaju. /path/to/yourscript
Wstrzymano do odwołania.
1
@amirrustam, przeczytaj superuser.com/questions/176783/…
lesmana
1

Próbować:

#!/bin/bash
# .... some previous code ...
# help set exec | less
set -- 1 2 3 4 5  # fake command line arguments
exec bash --login -c '
echo $0
echo $@
echo my script continues here
' arg0 "$@"
tilo
źródło