2010-12-18 17 views
7

Mam prosty problem ze zrozumieniem zachowania w systemie Linux. W skrócie, na Linuksie, jeśli wywołuję mój skrypt sh z "Desktop Shortcut", skrypt nie może zobaczyć najnowszych zmiennych środowiskowych (ustawionych w bashrc). Więc zastanawiałem się, w jakim zakresie znajduje się ten skrypt powłoki?.Bashrc nie jest czytany, gdy skrypt powłoki jest wywoływany ze skrótu na pulpicie

Aby utworzyć testcase i reprodukować:

  1. Tworzenie prostych skryptów powłoki 'testme.sh':

     
    !/bin/sh 
    echo "Hi This is a test script checking the env var"; 
    echo "TESTVAR = $TESTVAR"; 
    read in 
    echo "Done"; 
    
  2. utworzyć na pulpicie skrót do skryptu powyżej.

     
    cd ~/Desktop 
    vi mytest-desktop.desktop 
    
    
    //Contents for mytest-desktop.desktop are : 
    [Desktop Entry] 
    Version=1.0 
    Type=Application 
    Name=TestAbhishek 
    Exec=/home/abhishek/test/hello.sh 
    Terminal=true 
    
  3. teraz zaktualizować plik .bashrc ustawić zmienną
 
    export TESTVAR=test_this_variable 
  1. otworzyć nowy terminal marki i uruchomić skrypt przy użyciu to pełna ścieżka jak '' ~/testme.sh // Widać wartość dla zmiennej "TESTVAR" z pliku .bashrc.

  2. Teraz wystarczy dwukrotnie kliknąć i wykonać skrót na pulpicie. // To powinno otworzyć terminal i wydrukować wartość "TESTVAR" jako pustą. // Więc moje pytanie brzmi: kto jest rodzicem dla terminala otwartego tym skrótem?

Próbowałem tego na RHL. Poszukuję rozwiązania lub w/a dla tego problemu, mam nadzieję, że ktoś może wkrótce pomóc.

Dzięki, Abhishek.

Odpowiedz

11

Zobacz sekcję strony bash na stronie INVOCATION. Oto fragment

Gdy bash wywoływany jest jako interaktywny logowania muszli lub jako nieinterakcyjnym powłoki z opcją --login, to najpierw odczytuje i wykonuje polecenia z pliku/etc/profil, jeśli istnieje plik . Po odczytaniu tego pliku, szuka ~/.bash_profile, ~/.bash_login, i ~/.profile, w tej kolejności i czyta i wykonuje komendy od pierwszego, które istnieje i jest odczytywalne . Opcja -noprofile może zostać użyta, gdy powłoka zostanie uruchomiona do , zahamować to zachowanie.

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

Kiedy interaktywna powłoka, która nie jest powłoką zgłoszeniową jest uruchomiony, bash czyta i wykonuje polecenia z ~/.bashrc, jeśli plik istnieje. Może to być zablokowane za pomocą opcji --norc. Opcja pliku --rcfile wymusza bash, aby odczytać i wykonać polecenia z pliku zamiast ~/.bashrc.

Krótko mówiąc, jeśli chcesz non-interactive shell do stosowania pewnych ENV Vars ustawić, a następnie umieścić je w ~/.bash_profile zamiast ~/.bashrc