Розуміння .bashrc та .bash_profile


26

На сервері, коли я входжу як root, я бачу .bashrc(Ubuntu 10.10).

На моєму Mac я маю .bash_profile

У Ubuntu завжди є лише .bashrcфайл, а ні .bash_profile? (Я просто розгублений, тому запитую, я розумію, що вони різні / не, але, можливо, стосунки є якимось чином?)

На своєму сервері я хочу створити псевдонім, чи потрібно його вставити .bashrc?

Що робити, якщо я хочу застосувати цей псевдонім, щоб усі користувачі могли ним користуватися?


1
можливо, дублікат: askubuntu.com/questions/1528/bashrc-or-bash-profile - я б рекомендував вам змінити питання, щоб просто запитати, де розмістити псевдоніми в усьому світі.

Відповіді:


39

Псевдоніми Bash повинні надходити у файли .bash_aliasesабо .bashrcв окремі домашні каталоги. Якщо вам потрібно створити глобальні псевдоніми bash, вони можуть увійти /etc/bash.bashrc, але найчастіше краще просто додати їх до файлів .bash_aliasesабо .bashrcфайлів, /etc/skelщоб вони успадковувались новоствореними користувачами.

Це практично завжди неправильно визначити псевдонім в в .profile, .bash_profileабо /etc/profile.

Щоб зрозуміти, чому, потрібно зрозуміти, за яких обставин виконуються команди з кожного з цих файлів . З цього приводу є помилкові уявлення, про які я звертаюсь нижче.

Незважаючи на те, що ви хочете визначити псевдоніми для декількох користувачів, вам слід ознайомитись з тим, як вони визначені для окремих користувачів, щоб ви могли визначитися з найкращим методом робити те, що вам потрібно.

Псевдоніми для окремих користувачів

Особливо, якщо ви користуєтесь графічним інтерфейсом, більшість ваших інтерактивних оболонок, ймовірно, оболонки без входу . Навіть якщо ви ніколи не використовуєте графічний інтерфейс, ви, ймовірно, використовуєте оболонки без входу з деякою частотою. Ви хочете, щоб ваші псевдоніми працювали в цих оболонках.

Особливо, якщо ви коли-небудь входите не графічно у віртуальну консоль або через SSH , ви, певно, використовуєте оболонки для входу частину часу. Тому ви хочете, щоб ваші псевдоніми також працювали в інтерактивних оболонках входу.

Коли запускається інтерактивна оболонка без входу , вона надходить .bashrcу домашній каталог користувача. За замовчуванням в Ubuntu кожен користувач .bashrcсам джерела .bash_aliases, якщо він існує.

  • Для джерела файл є причиною його вміст буде працювати в поточній оболонці. Зміни в середовищі оболонки, внесені до файлу, який зберігається, зберігаються навіть після запуску всіх команд у файлі.

Читання коментарів за замовчуванням Ubuntu .bashrcпоказує, що офіційно призначено псевдоніми .bashrcабо .bash_aliases. .bashrcвже містить деякі визначення псевдоніму (запустіть їх, grep '^[[:blank:]]*alias' ~/.bashrcщоб побачити їх), і дає чіткі поради щодо того, куди слід поставити нові такі визначення:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

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

А як щодо інтерактивних оболонок для входу ? Замість того .bashrc, щоб увійти до джерела оболонок .profile.

  • ... Якщо .bash_loginнемає, то він замість цього отримується.
  • ... Якщо .bash_profileнемає, то він замість цього отримується.

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

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Я пропоную користувачам визначити нові псевдоніми bash .bash_aliasesу своїх домашніх каталогах (створити його, якщо його ще не існує). Це особливо чистий і простий спосіб зробити визначення псевдонімів постійними на рівні кожного користувача.

Псевдоніми не слід визначати,.profile оскільки вони залишатимуться невизначеними в оболонках, що не входять. На відміну від більшої частини середовища, що стосується панцирної оболонки, псевдоніми не експортуються до дитячих оболонок:

ek@Io:~$ alias hi='echo "Greetings, $USER!"'
ek@Io:~$ hi
Greetings, ek!
ek@Io:~$ bash
ek@Io:~$ hi
hi: command not found

Зокрема, за замовчуванням більшість середовищ настільних комп'ютерів спричиняють пошук .profileу графічному вході, але:

  1. Це необов’язково робиться за допомогою оболонки bash, тому визначення псевдонімів може навіть не оброблятися, а ще важливіше
  2. навіть якщо визначення псевдонімів обробляються, вони не передаються дочірнім процесам . Зокрема, вони не передаються оболонкам, створеним відкриттям вікна терміналу!

Псевдоніми не повинні визначатися в .bash_profile(або .bash_login) з тієї самої причини, але також з іншої причини. Наївно створення одного з цих файлів і введення в нього просто псевдонімів заважає жодному коду .profileне запускатися!

У ситуаціях , коли .bash_profileабо на .bash_loginсамому справі корисно, як правило , один джерела .profileде - то в них, вирішує цю проблему. (Тоді єдина проблема, яка залишається в тому, що, як, наприклад .profile, визначення псевдонімів у .bash_profileабо .bash_loginне працює правильно.)

Псевдоніми для нових індивідуальних користувачів, автоматично

Коли створюється обліковий запис користувача типу, призначеного представляти реальну людину, зазвичай створюється новий каталог, який слугуватиме їх домашнім каталогом. Потім вміст /etc/skelкопіюється в їх домашній каталог. Ось так кілька користувачів починають деякі подібні файли конфігурації в своїх домашніх каталогах. В Ubuntu, це включає в себе .profile, .bashrcі деякі інші файли.

Для того, щоб змінити те , що псевдоніми визначені для нових користувачів, ви можете просто покласти їх в /etc/skel/.bash_aliases(ви повинні створити його) або /etc/skel/.bashrc.

Якщо ви відредагуєте вже наявний файл, /etc/skelможливо, спершу потрібно створити його резервну копію - але не слід вставляти резервну копію /etc/skel, або він також буде скопійований у домашні каталоги нових користувачів.

Це, мабуть, найкращий спосіб для додавання нових псевдонімів для кількох користувачів. Існуючі користувачі можуть просто додати псевдоніми самі. Якщо ви визначите псевдоніми в /etc/skel/.bash_aliases, ви можете просто направити їх у той файл, який вони можуть скопіювати у свої домашні каталоги (або додати у свій власний .bash_aliasesфайл).

Користувач банально визначити псевдонім. Крім того, псевдоніми не є надзвичайно надійними ; вони працюють лише за певних обставин. Якщо вам потрібно створити нову команду, яка працює весь час, для всіх ви не повинні реалізовувати цю команду як псевдонім. І ви не можете успішно застосовувати псевдоніми на користувачів, які не хочуть їх - вони можуть просто unaliasїх.

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

Хоча я раджу вам уникати такого підходу, ви можете визначити псевдоніми у глобальному /etc/bash.bashrc файлі. Потім вони будуть визначені як для інтерактивних оболонок без входу, так і для оболонок інтерактивного входу. Причина полягає в тому, що перед тим , як отримати будь-який з файлів у домашньому каталозі користувача:

  • Оболонки для входу (і лише оболонки для входу та інші процеси, що ведуть себе як оболонки для входу) запускають команди /etc/profileавтоматично.
  • Тільки оболонки, що не входять в систему, виконують команди /etc/bash.bashrcавтоматично, але
  • За замовчуванням Ubuntu /etc/profileперевіряє, чи є запущена оболонка bash (та чи /etc/bash.bashrcіснує) та, якщо так, джерела /etc/bash.bashrc.

Це аналогічно тому, як за замовчуванням користувач .profileнадсилає джерела для користувача, .bashrcякщо оболонка є bash (як детальніше вище).

Ось як виглядає фактичний код для цього за замовчуванням /etc/profile:

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

Цей блок також виконує інші завдання. Зокрема, зовнішнєif перевірка, чи оболонка, ймовірно, буде інтерактивною (перевіряючи, чи текст підказки не порожній), а потім перевіряє, чи є поточна оболонка bash та джерела, /etc/bash.bashrcякщо вона є, а якщо ні, чи не працює якась робота для bash , вже зроблено в /etc/bash.bashrc.

Ви повинні НЕ визначити глобальні псевдоніми в/etc/profile протягом тих же користувачів , причина не повинні визначати їх в місцевих .profileз: якщо ви це зробите, то вони будуть визначені тільки для входу в оболонках, а не для їх дочірніх оболонок.

Нарешті, зауважте, що на відміну від користувача .bashrcза замовчуванням, /etc/bash.bashrcфайл за замовчуванням не містить нічого про псевдоніми. Дещо незвично надавати користувачам псевдоніми у файлі, де вони не можуть їх редагувати чи вимикати. (Звичайно, вони все ще можуть це зробити, переосмисливши свої визначення у своїх місцевих.bashrc , .bash_aliasesабо в іншому місці.)

Подальше читання


5

Ось приємне читання . ".bash_profile виконується для оболонок входу, тоді як .bashrc виконується для інтерактивних оболонок без входу".

Тому для свого псевдоніма використовуйте .bash_profile


4
Введення псевдонімів .bash_profileне є правильним. У Ubuntu .profile(який працює для оболонок входу) джерела, .bashrcколи це інтерактивна оболонка bash. Таким чином, додавання псевдонімів у .bashrc(або .bash_aliasesвбудоване в них .bashrc) визначає їх у всіх інтерактивних оболонках. Псевдоніми в .bash_profileврожайності ця проблема , серед інших. Дивіться це , що , моя відповідь , і за замовчуванням ~/.bashrcкоментарів рекомендуючи кладучи псевдоніми там або в «и .bash_aliases.
Елія Каган
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.