Понимание .bashrc и .bash_profile

26

На сервере, когда я вхожу в систему как root, я вижу .bashrc(Ubuntu 10.10).

На моем Mac у меня есть .bash_profile

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

На моем сервере, я хочу , чтобы создать псевдоним, я должен поставить его в .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проверяет , является ли текущая оболочка Баш (если .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 потому что они будут оставаться неопределенными в оболочках без входа в систему. В отличие от большей части среды оболочки bash, псевдонимы не экспортируются в дочерние оболочки:

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по той же причине, по которой пользователи не должны определять их в своих локальных .profiles: если вы это сделаете, они будут определены только для оболочек входа в систему, а не для их дочерних оболочек.

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

Дальнейшее чтение

Элия ​​Каган
источник
5

Вот немного хорошего чтения на этом. «.bash_profile выполняется для оболочек входа в систему, в то время как .bashrc выполняется для интерактивных оболочек без входа в систему»

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

geermc4
источник
4
Ввод псевдонимов .bash_profileне является правильным. В Ubuntu .profile(который работает для оболочек входа в систему) исходники, .bashrcкогда это интерактивная оболочка bash. Таким образом, размещение псевдонимов .bashrc(или .bash_aliasesисточников .bashrc) определяет их во всех интерактивных оболочках bash. Псевдонимы .bash_profileприводит к этой проблеме , среди других. Посмотрите это , это , мой ответ и ~/.bashrcкомментарии по умолчанию , рекомендующие размещать псевдонимы там или внутри .bash_aliases.
Элия ​​Каган,