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