Чому мій ~ / .bash_profile не працює?


35

Я використовую Linux Mint. Моя оболонка для входу ( cat /etc/passwd | grep myUserName) - це bash.

Після того, як я запускаю своє графічне середовище робочого столу та запускаю з нього термінальний емулятор, я бачу, що .bash_profileце не джерело (параметри середовища, які exportредагуються в ньому, не встановлені). Але якщо я входжу з текстової консолі ( ctrl+ alt+ F1) або запускаю вручну bash -lз емулятора терміналу, це .bash_profileпрацює чудово.

Чи помиляюся я, коли думаю, що це .bash_profileслід знайти, коли починається X, і всі exportтермінали повинні бути доступні в терміналі, що працює з X?

PS Поміщення всього .bashrcта отримання джерела з .bash_profileних не є хорошою ідеєю ( https://stackoverflow.com/questions/902946/ ): матеріали з навколишнього середовища потрібно отримувати лише один раз.

Відповіді:


39

Файл ~/.bash_profileчитається bash, коли це оболонка для входу. Це те, що ви отримуєте під час входу в текстовий режим.

Коли ви входите під X, скрипти запуску виконує /bin/sh. На Ubuntu та Mint /bin/sh- тире , а не баш. І Dash і bash мають однакові основні функції, але тире дотримується цих основних функцій для того, щоб бути швидким і малим, тоді як bash додає безліч функцій за рахунок того, що вимагає більше ресурсів. Зазвичай тире для сценаріїв, які не потребують додаткових функцій, і bash для інтерактивного використання (хоча zsh має багато приємніших функцій ).

Більшість комбінацій менеджера дисплея (програма , де ви вводите ім'я користувача та пароль) і оточення робочого столу читати ~/.profileзі сценаріїв входу в /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsessionабо в залежності від того може бути застосовано. Тому поставте визначення змінних вашого середовища ~/.profile. Обов’язково використовуйте лише синтаксис, який підтримує тире.

Отже, що вам слід куди поставити?

  • Хороший .bash_profileнавантаження .profileта навантаження, .bashrcякщо оболонка інтерактивна.

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
  • В .profile, нанесеного визначення змінної середовища, а також інші параметри сеансу , такі як ulimit.

  • В .bashrc, покласти Баш інтерактивні настройки , таким як псевдоніми, функція завершення, прив'язки клавіша (які не перебувають у .inputrc), ...

Дивіться також різницю між оболонкою для входу та оболонкою без входу? та альтернатива .bashrc .


1
багато речей дізнався з однієї відповіді :)
mtk

16

.bash_profile- це сценарій конфігурації запуску bash. Не існує стандартного доручення X на джерело .bash_profile.

Те, про що ти думаєш, швидше .profile. Спочатку це був файл конфігурації запуску оболонки bourne (sh). Сьогодні для багатьох дистрибутивів середовище робочого столу налаштовано на джерело .profile. Зауважте, що це також не є стандартом, але це, здається, є умовою.

Debian використовувався для джерела .profileпри графічному вході ( сторінка wiki станом на 2013 рік ), тепер не ( сторінка wiki станом на 2016 рік ).

Архівні джерела .xprofileза графічним входом ( сторінка wiki станом на 2013 рік ).

Ubuntu раніше відмовлявся від використання .profile( сторінка wiki станом на 2013 рік ), тепер більше не перешкоджає ( сторінка wiki станом на 2016 рік ).


Щодо вашого іншого питання: Чому мій ~ / .bash_profile не працює? Така очікувана поведінка.

Коротше кажучи, поведінка така:

  • bash розпочався як інтерактивна оболонка входу: читає ~/.profile
  • bash розпочався як інтерактивна оболонка без входу: читає ~/.bashrc

Детальніше дивіться мою відповідь на аналогічне запитання в askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc / 132319 # 132319


1
Дещо це правильно, але "завжди читати ~/.bashrc" - це погана порада: читати.bashrc слід лише з інтерактивної оболонки . Тут ви пропустили основну проблему, яка полягає в тому, що при вході в систему під X не існує екземпляра входу bash (під більшістю комбінацій дисплея / робочого середовища, включаючи очевидно AntonioK).
Жил 'SO- перестань бути злим'

Спасибі за ваш відгук. Сподіваюся, я досить добре оновив свою відповідь, щоб вирішити Ваші скарги. Щодо моїх порад "завжди читати .bashrc", я мав на увазі завжди інтерактивну оболонку. Я уточнив цю частину. Я сподіваюся, що це більше не вводить в оману.
lesmana

2
" Ubuntu спеціально відмовляє, використовуючи .profile( посилання ) " Вікі одного разу (абсурдно) відштовхує це; це було виправлено. (Примітка /etc/profileне залишається перешкодою для загальносистемних завдань, надаючи перевагу доданню скриптів до /etc/profile.d.) .profileФайли користувачів користувача тепер представлені як один із рекомендованих способів встановлення змінних середовища для користувача: "Підходящі файли для параметрів змінної середовища, які повинні впливати лише на конкретний користувач (а не система в цілому) - ~ / .pam_environment та ~ / .profile . "
Eliah Kagan

Пов'язана сторінка про Debian вказує на те, що Debian не читає ~/.profileдля графічного входу, а його ~/.xsessionrcслід використовувати.
karora

дякую за те, що помітили. оновлено сторінку вікі. я пов’язаний з версіями, як вони були на час відповіді.
lesmana

2

У своєму запитанні ви посилаєтесь на https://stackoverflow.com/questions/902946/ як на рекомендацію не надсилати джерело, коли прийнята відповідь призначає

  • Помістіть мою настройку PATH у файл .profile (оскільки я інколи використовую інші оболонки)
  • Помістіть мої псевдоніми та функції Bash у мій файл .bashrc
  • Потім скористайтеся цим [ЗРЕШЕНО: коментарі кодового фрагмента]:

    .bash_profile:

    #!/bin/bash
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # Get the paths
    source ~/.bashrc  # get aliases

Зробити все .profileце не працювало для мене на Linux Mint. Використання .bashrcпрацювало чудово.


2

При спробі перезавантажити / source ~ / .profile файл виникає кілька проблем. [Це стосується Ubuntu linux - у деяких випадках деталі команд будуть різними]

  1. Ви запускаєте це безпосередньо в терміналі чи в сценарії?
  2. Як це запустити у сценарії?

Оголошення. 1)

Якщо запустити це безпосередньо в терміналі, це означає, що не буде створено підпакет. Таким чином, ви можете використовувати дві команди:

source ~/.bash_profile

або

. ~/.bash_profile

В обох випадках це оновить середовище вмістом файлу .profile.

Оголошення 2) Ви можете запустити будь-який сценарій bash, зателефонувавши

sh myscript.sh 

або

. myscript.sh

У першому випадку це створить додаткову оболонку, яка не вплине на змінні середовища вашої системи, і вони будуть видимі лише для процесу підзарядки. Після завершення команди підпакетів жоден експорт тощо не застосовуватиметься. Це загальна помилка і спричиняє багато розробників, щоб вибути багато часу.

Для того, щоб ваші зміни, застосовані до вашого сценарію, мали вплив на глобальне середовище, з яким слід запускати сценарій

.myscript.sh

командування.

Для того, щоб переконатися, що ваш сценарій не запускається в допоміжній програмі, ви можете використовувати цю функцію. (Знову приклад - для оболонки 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
}

Я сподіваюся, що це очистить деякі поширені непорозуміння! : D удачі!


0

Просте рішення - зробити термінал терміналом для входу. Для терміналу Gnome в розділі "Плитка і команда" профілю за замовчуванням ви можете встановити прапорець "Запустити команду як оболонку входу". Ця стаття пояснює різницю між оболонкою для входу та тією, яка не є.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.