Чому Ubuntu за замовчуванням ~ / .profile джерело ~ / .bashrc?


30

Це вміст запасу, ~/.profileякий надійшов з мого 13.10 (коментовані рядки видалено):

if [ -n "$BASH_VERSION" ]; then
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Це успадковано від Debian, але чому Canonical вирішив зберегти його? Наскільки я знаю, це не стандартний * nix спосіб, і я бачив різні системи, де цього не сталося, тому я припускаю, що вони, мабуть, мали вагомі причини. Це може спричинити несподівану поведінку під час запуску оболонок для входу (наприклад, наприклад, при сшиванні в машину), де користувач не сподівався б, що він ~/.bashrcзнайдеться.

Єдина користь, яку я можу придумати, - це не плутати користувача з багатьма запусковими файлами та дозволяти їм редагувати .bashrcсамостійно та читати їх незалежно від типу оболонки. Це, однак, є сумнівною перевагою, оскільки часто корисно мати різні параметри для входу та для інтерактивних оболонок, і це заважає вам це робити. Також оболонки входу дуже часто не запускаються у графічному середовищі, що може спричинити помилки та попередження та проблеми (о, мій!) Залежно від того, що ви встановили у цих файлах.

То чому Ubuntu робить це, чого я пропускаю?


Чому це було -n "$BASH_VERSION"б правдою поза басом?
Елліот Фріш

@ElliottFrisch цього не буде. Моє питання, чому .profileджерело .bashrc, це не так у всіх версіях Linux, і мені цікаво, що це за обґрунтування.
тердон

Здається, що таким чином реалізовано в debian вище за течією.
Елліот Фріш

@ElliottFrisch так, я подумав, що це не так, і подивився, і побачив, що вчасно відредагувати свій коментар. Тим не менш, це не так у системі SuSe, до якої я маю доступ (хоч це і на CentOS), і це було не так у різних системах (RH, Fedoras, старший Ubuntus), наскільки я пам'ятаю. Тож мені цікаво, чому.
тердон

Відповіді:


15

Це рішення, що надходить від Debian. Обґрунтування цього пояснюється в цьому дуже приємному вікі-пості , з якого подано нижче уривок. Короткий підсумок - "гарантувати, що вхід GUI та не GUI працюють однаково":

Візьмемо xdm як приклад. один день пієр повертається з відпустки і виявляє, що його системний адміністратор встановив xdm в системі Debian. Він увійде в систему просто, а xdm зчитує його .xsession файл та запускає флюкс-скриньку. Здається, все гаразд, поки він не отримає повідомлення про помилку в неправильній місцевості! Оскільки він переосмислює змінну LANG у своєму .bash_profile, а оскільки xdm ніколи не читає .bash_profile, його змінна LANG тепер встановлена ​​на en_US замість fr_CA.

Тепер наївне рішення цієї проблеми полягає в тому, що замість запуску "xterm" він міг налаштувати свого вікна-менеджера для запуску "xterm -ls". Цей прапор повідомляє xterm, що замість запуску звичайної оболонки він повинен запустити оболонку входу. У цьому налаштуванні xterm нереєструє / bin / bash, але він ставить "- / bin / bash" (а може бути "-bash") у вектор аргументу, тому bash діє як оболонка входу. Це означає, що щоразу, коли він відкриває новий xterm, він буде читати / etc / profile та .bash_profile (вбудована поведінка bash), а потім .bashrc (тому що .bash_profile говорить про це). Спочатку це може здатися прекрасним - його точкові файли не надто важкі, тому він навіть не помічає затримки - але є більш тонка проблема. Він також запускає веб-браузер безпосередньо зі свого меню fluxbox, і веб-браузер успадковує змінну LANG від fluxbox, який тепер встановлений у неправильній локалі. Тож хоча його xterms може бути нормальним, і все, що було запущено з його xterms, може бути нормальним, його веб-браузер все ще надає йому сторінки в неправильній місцевості.

Отже, яке найкраще рішення цієї проблеми? Справді не існує універсального. Кращий підхід - це змінити .xsession файл, щоб виглядати приблизно так:

[ -r /etc/profile ] && source /etc/profile
[ -r ~/.bash_profile ] && source ~/.bash_profile
xmodmap -e 'keysym Super_R = Multi_key'
xterm &
exec fluxbox

Це призводить до того, що оболонка, що інтерпретує сценарій .xsession, читає в / etc / profile та .bash_profile, якщо вони існують та читаються, перед запуском xmodmap або xterm або "виконувати" менеджер вікон. Однак є один потенційний недолік цього підходу: під xdm оболонка, що читає .xsession, працює без контрольного терміналу. Якщо або / etc / profile, або .bash_profile використовує будь-які команди, які передбачають наявність терміналу (наприклад, "fortune" або "stty"), ці команди можуть не працювати. Це основна причина, чому xdm не читає ці файли за замовчуванням. Якщо ви збираєтеся використовувати цей підхід, ви повинні переконатися, що всі команди у ваших "точкових файлах" безпечно виконуватись, коли немає терміналу.


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

2

Це стандартна поведінка Ubuntu, ~/.bashrcце файл запуску на основі інтерактивних оболонок на рівні користувача. При відкритті терміналу в основному ви запускаєте інтерактивну оболонку без входу, яка зчитує ~/.bashrcта вміст ~/.bashrcотримує джерело та експортується у поточне середовище оболонки. Він допомагає отримати всі визначені користувачем змінні оболонки та функції в поточній оболонці. Також ви можете знайти подібні рядки

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

для отримання визначених користувачем псевдонімів у поточному середовищі оболонки.

Це важливо для того, щоб також забезпечити хороший досвід роботи користувачів. Наприклад , один може зберігати проксі посвідчення в системі .bashrc, якщо вона не отримати ні один з джерел термінальних додатків ( а саме , ping, wget, curl, і lynxт.д.) буде працювати належним чином. Або вам потрібно надати облікові дані проксі кожного разу, коли ви відкриваєте термінал.

Окрім Ubuntu, за замовчуванням .bashrcміститься багато зручних псевдонімів (для lsта grepдруку кольорового виводу), багато нових визначень для різних змінних оболонок, що збільшує досвід користувача.

Але у випадку вашого входу в ssh або входу у віртуальну консоль , ви в основному отримуєте інтерактивну оболонку входу. Там файл ініціації оболонки ~/.profile. Отже, якщо ви не знайдете джерело, ~/.bashrcви пропустите всі ті корисні налаштування у вашому .bashrc. Ось чому ~/.profileджерело Ubuntu за замовчуванням~/.bashrc

Справа, яку слід уникати

  • ніколи не слід вводити ~/.profileформу всередину ~/.bashrcодночасно, коли ~/.bashrcпоходить з неї ~/.profile. Це створить нескінченний цикл ситуації, і в результаті запит на термінал буде призупинено, якщо ви не натиснете Ctrl+ C. У такій ситуації, якщо ви поставите рядок у своєму~/.bashrc
встановити -x

Тоді ви могли побачити, що дескриптор файлів зупиняється, коли ви відкриваєте термінал.


Дякую, це вся правдива та корисна інформація. Це просто не стосується мого питання. Мені знайомі відмінності між оболонками для входу та не входами. Моє запитання, чому в системах Ubuntu працює .profileджерело .bashrc? SuSe Enterprise 10 цього не робить, ні одна з версій Fedora, яку я використовувала, але це було років тому, я можу помилятися. CentOS 5.8 досить дивно. Все одно ви бачите мою думку? Це вибір дизайну, і мені цікаво, чому він був зроблений.
тердон

Я не використовував жорстко інших дистрибутивів Linux, які ви назвали. Ви можете мені сказати, як вони обробляють ситуації, такі як псевдонімні команди в сесії ssh, визначені в .bashrcабо в .bash_aliases. Наприклад, у мене є псевдонім, lsяк ls --color=autoв моєму, .bashrcі мій .bashrcотриманий з мого .profile. Тут я можу використовувати псевдонім навіть від ssh. Або я можу використовувати проксі в сесії ssh. Якщо я не джерело My .bashrcвід .profileмене втратити ці функції. Я думаю, що все стосується кращого користувацького досвіду.
souravc

Вони ні, ці псевдоніми не працюватимуть. І так, джерело це .bashrcвиправляє. Але це також спричиняє проблеми, я пам’ятаю, коли я вперше застосував систему, яка мала таку поведінку, я продовжував отримувати ці дивні повідомлення, коли sshя це спричиняв, тому що я використовував xset b offу своєму, .bashrcякий використовував для відключення термінального дзвоника, але тільки в системі X, так що надсилала повідомлення про помилки. Мені потрібні віки, щоб зрозуміти, що відбувається, оскільки я не думав, що .bashrcце буде прочитано під час запуску оболонки для входу. Мені просто цікаво, чи є з цього приводу "офіційна" заява.
тердон

Я погоджуюсь з тобою. Раніше я також стикався з деякими неприємностями . Але це в основному корисно і зручно для користувачів, якщо ви пам’ятаєте і уникаєте декількох особливих випадків. Чи не так :)
souravc

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