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

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

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

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

На моем сервере я хочу создать псевдоним. 114]?

Что если я хочу, чтобы этот псевдоним был применен, чтобы все пользователи могли его использовать?

26
задан 21 August 2016 в 22:59

2 ответа

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

Фактически всегда неправильно определить псевдоним в в .profile, .bash_profile, или /etc/profile.

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

Даже при том, что Вы хотите определить псевдонимы для многочисленных пользователей, необходимо быть знакомы с тем, как они определяются для отдельных пользователей, так, чтобы можно было выбрать лучший метод выполнения, в чем Вы нуждаетесь.

Псевдонимы для отдельных пользователей

Особенно при использовании GUI большинство интерактивных оболочек является, вероятно, оболочками невхода в систему. Даже если Вы никогда не используете GUI, Вы, вероятно, все еще используете оболочки невхода в систему с некоторой частотой. Вы захотите, чтобы Ваши псевдонимы работали в этих оболочках.

Особенно, если Вы когда-нибудь входите в систему неграфически в виртуальной консоли или через 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_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. Это не обязательно сделано оболочкой удара, таким образом, определения псевдонима даже не могут быть обработаны, и что еще более важно
  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 проверки, если рабочая оболочка является ударом (и если /etc/bash.bashrc существует), и, если так, источники /etc/bash.bashrc.

Это походит как значение по умолчанию, в расчете на пользователя .profile получает в расчете на пользователя .bashrc если оболочка является ударом (как детализировано выше).

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

Вы не должны определять глобальные псевдонимы в /etc/profile по той же причине пользователи не должны определять их в своем локальном .profiles: если Вы сделаете, то они будут определены только для оболочек входа в систему, а не для их дочерних оболочек.

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

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

39
ответ дан 21 August 2016 в 22:59

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

0
ответ дан 21 August 2016 в 22:59

Другие вопросы по тегам:

Похожие вопросы: