.bashrc не читается, когда сценарий оболочки вызывается из ярлыка на рабочем столе - PullRequest
7 голосов
/ 18 декабря 2010

У меня простая проблема с пониманием поведения в linux.Короче говоря, в Linux, если я вызываю свой сценарий sh из «Ярлыка на рабочем столе», сценарий не может видеть последние переменные среды (установленные в bashrc).Поэтому мне было интересно, в каком объеме находится этот сценарий оболочки?

Чтобы создать тестовый сценарий и воспроизвести:

  1. Создание простого сценария оболочки 'testme.sh':

    !/bin/sh
    echo "Hi This is a test script checking the env var";
    echo "TESTVAR = $TESTVAR";
    read in
    echo "Done";
    
  2. создайте ярлык на рабочем столе для приведенного выше сценария.

    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. Теперь обновите файл .bashrc, чтобы задать переменную
   export TESTVAR=test_this_variable
   
  1. Откройте новый терминал и выполните сценарий, используя его полный путь, например '~ / testme.sh' // Это может увидеть значение переменной 'TESTVAR' из файла .bashrc.

  2. Теперь просто дважды щелкните и запустите ярлык на рабочем столе.// Это должно открыть терминал и распечатать значение для 'TESTVAR' как пустое.// Итак, мой вопрос: кто является родителем для терминала, открытого этим ярлыком?

Я пробовал это на БРЗ.Я ищу решение или aw / a для этой проблемы, надеюсь, кто-то может помочь в ближайшее время.

Спасибо, Абхишек.

1 Ответ

11 голосов
/ 18 декабря 2010

См. Раздел INVOCATION на странице руководства bash.Вот выдержка

Когда bash вызывается как интерактивная оболочка входа в систему или как неинтерактивная оболочка с параметром --login, она сначала читает и выполняет команды из файла / etc / profile, если этот файл существует.После прочтения этого файла он ищет ~ / .bash_profile, ~ / .bash_login и ~ / .profile в указанном порядке, а также читает и выполняет команды из первой, которая существует и доступна для чтения.Параметр --noprofile может использоваться при запуске оболочки, чтобы запретить это поведение.

При выходе из оболочки входа в систему bash читает и выполняет команды из файла ~ / .bash_logout, если он существует.

Когда запускается интерактивная оболочка, которая не является оболочкой входа в систему, bash читает и выполняет команды из ~ / .bashrc, если этот файл существует. Это может быть запрещено с помощью параметра --norc.Опция --rcfile file заставит bash читать и выполнять команды из файла вместо ~ / .bashrc.

Короче говоря, если вы хотите, чтобы в неинтерактивных оболочках были установлены определенные переменные ENV,затем поместите их в ~/.bash_profile вместо ~/.bashrc

...