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


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

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


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!


4

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


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 "$@"
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.