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

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

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

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

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

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

2 ответа

Решение

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

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

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

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

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

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

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