Файл .bashrc — это пользовательский shell-скрипт, который Bash читает и выполняет при запуске интерактивной оболочки, не являющейся login-shell. Обычно он находится в домашнем каталоге пользователя по адресу ~/.bashrc. В этом файле хранят настройки командной строки: алиасы, функции, переменные окружения и параметры приглашения Bash.
Что такое .bashrc
.bashrc используется для персональной настройки окружения Bash. При запуске новой интерактивной оболочки команды из этого файла выполняются автоматически.
В .bashrc можно добавлять сокращения для часто используемых команд, собственные shell-функции, переменные окружения и настройки приглашения командной строки.
Файл является скрытым, поскольку его имя начинается с точки. Поэтому обычная команда ls его не показывает. Чтобы увидеть .bashrc и другие скрытые файлы в домашнем каталоге, используется:
ls -aОбычно среди файлов будут находиться .bashrc, .bash_profile, .profile и другие конфигурационные файлы.
Если .bashrc отсутствует, его можно создать вручную:
touch ~/.bashrcПосле этого файл можно открыть в текстовом редакторе и добавить необходимые настройки.
Когда Bash читает .bashrc
.bashrc выполняется при запуске интерактивной оболочки Bash, которая не является login-shell. Например, это происходит при открытии нового окна или вкладки терминала в большинстве Linux-дистрибутивов.
Login-shell работает иначе. При подключении по SSH Bash обычно запускается как интерактивная login-shell и сначала читает /etc/profile, а затем ищет пользовательские файлы в следующем порядке:
~/.bash_profile
~/.bash_login
~/.profileBash использует только первый найденный файл из этого списка.
На практике пользовательские настройки из .bashrc часто становятся доступны и в login-shell, поскольку .bash_profile или .profile содержит вызов .bashrc:
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fiБлагодаря этому алиасы и функции из .bashrc работают и после подключения по SSH.
Неинтерактивные оболочки, например Bash, запущенный для выполнения скрипта, по умолчанию не читают ни .bashrc, ни .bash_profile. Для них Bash проверяет переменную BASH_ENV и загружает указанный в ней файл.
При завершении интерактивной login-shell Bash также может прочитать ~/.bash_logout, если такой файл существует.
.bashrc, .bash_profile и .profile
Файлы отвечают за разные типы shell-сессий:
~/.bashrcиспользуется пользовательскими интерактивными non-login shell. Это основной файл для алиасов, функций и настроек приглашения командной строки.~/.bash_profileиспользуется при запуске login-shell. В нём могут находиться переменные окружения и команды, которые должны выполняться при входе в систему.~/.profileявляется более универсальным вариантом и используется как резервный файл, если.bash_profileотсутствует.
На уровне системы аналогом .bashrc выступает /etc/bash.bashrc в Debian и Ubuntu или /etc/bashrc в RHEL и Fedora. Такие файлы содержат настройки, применяемые к интерактивным shell-сессиям пользователей системы.
Как открыть и изменить .bashrc
Перед изменением .bashrc рекомендуется сделать резервную копию:
cp ~/.bashrc ~/.bashrc.bakЕсли после редактирования файл окажется повреждён, резервную копию можно будет использовать для восстановления.
Для редактирования можно использовать nano:
nano ~/.bashrcПосле внесения изменений в nano нажмите Ctrl+O, затем Enter для сохранения и Ctrl+X для выхода.
Если используется vim, файл открывается командой:
vim ~/.bashrcДля перехода в режим редактирования нажмите i. После внесения изменений нажмите Esc, затем введите :wq и нажмите Enter.
Изменения не применяются автоматически к уже работающей shell-сессии. Для этого файл нужно перечитать.
Алиасы в .bashrc
Алиасы позволяют создать короткие имена для часто используемых команд.
Синтаксис выглядит так:
alias name='command'Например, в .bashrc можно добавить:
# Подробный список файлов
alias ll='ls -lha'
# Подсветка результатов grep
alias grep='grep --color=auto'
# Очистка терминала
alias c='clear'
# Обновление пакетов в Debian и Ubuntu
alias update='sudo apt update && sudo apt upgrade -y'
# Получение публичного IP-адреса
alias myip='curl ifconfig.me; echo'После сохранения файла настройки необходимо загрузить:
source ~/.bashrcПосле этого вместо ls -lha можно использовать ll, а команда c будет очищать экран терминала.
Алиасы подходят для простых сокращений. Если команде нужно передавать аргументы, выполнять несколько операций или использовать условную логику, вместо алиаса лучше создать shell-функцию.
Переменные окружения и $PATH
.bashrc можно использовать для настройки переменных окружения. Например, чтобы задать текстовый редактор по умолчанию:
export EDITOR='nano'Команда export делает переменную доступной для процессов, которые запускаются из текущей shell-сессии. Без export переменная остаётся доступной только внутри текущей оболочки.
Через .bashrc также можно изменить переменную $PATH. Она содержит список каталогов, в которых shell ищет исполняемые команды.
Например, чтобы добавить каталог ~/bin:
export PATH="$HOME/bin:$PATH"Здесь существующее значение $PATH сохраняется. Каталог $HOME/bin добавляется в начало списка, поэтому программы из него будут иметь приоритет перед одноимёнными системными командами.
Можно добавить каталог и в конец:
export PATH="$PATH:$HOME/bin"В этом случае приоритет останется у системных каталогов.
Важно не перезаписывать $PATH без сохранения его текущего значения. Например, такая запись:
export PATH="$HOME/bin"удалит остальные каталоги из переменной и может привести к тому, что стандартные команды перестанут находиться через shell.
Настройка приглашения Bash через PS1
Внешний вид приглашения командной строки задаётся переменной PS1. Через неё можно отображать имя пользователя, имя хоста, текущий каталог и другую информацию.
Например, Bash может показывать текущую Git-ветку:
parse_git_branch() {
git symbolic-ref --short HEAD 2>/dev/null || git rev-parse --short HEAD 2>/dev/null
}
export PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[0;31m\]\$(parse_git_branch)\[\033[00m\]\$ "В этом примере \u обозначает имя пользователя, \h — имя хоста, а \w — полный путь текущего каталога.
Последовательности вида \[\033[...m\] используются для задания цвета. Выражение $(parse_git_branch) вызывает функцию, которая определяет текущую Git-ветку. Если репозиторий находится в состоянии detached HEAD, функция выводит короткий идентификатор коммита.
Для более сложной настройки Bash предоставляет переменную PROMPT_COMMAND. Bash выполняет указанную в ней команду непосредственно перед выводом каждого приглашения.
Например:
export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'Функции в .bashrc
Функции позволяют создавать более сложные команды, которые могут принимать аргументы, выполнять несколько операций и использовать условную логику.
Простой пример — функция mkcd, которая одновременно создаёт каталог и переходит в него:
mkcd ()
{
mkdir -p -- "$1" && cd -P -- "$1"
}Теперь вместо двух команд:
mkdir new-project
cd new-projectможно выполнить одну:
mkcd new-project$1 содержит первый аргумент функции. Команда mkdir -p создаёт каталог и при необходимости родительские каталоги. Оператор && запускает cd только в том случае, если создание каталога завершилось успешно.
Функции также можно использовать для объединения команд, которые отличаются в зависимости от типа входного файла. Например, функция extract может определять формат архива и выбирать соответствующую программу:
extract ()
{
if [ -f "$1" ] ; then
case "$1" in
*.tar.bz2) tar xvjf "$1" ;;
*.tar.gz) tar xvzf "$1" ;;
*.tar.xz) tar xvJf "$1" ;;
*.bz2) bunzip2 "$1" ;;
*.rar) unrar x "$1" ;;
*.gz) gunzip "$1" ;;
*.tar) tar xvf "$1" ;;
*.tbz2) tar xvjf "$1" ;;
*.tgz) tar xvzf "$1" ;;
*.zip) unzip "$1" ;;
*.Z) uncompress "$1" ;;
*.xz) unxz "$1" ;;
*.7z) 7z x "$1" ;;
*) echo "'$1' cannot be extracted via extract()" ;;
esac
else
echo "'$1' is not a valid file"
fi
}После этого разные типы архивов можно распаковывать одной командой:
extract my_files.zip
extract my_other_files.tar.gzФункция проверяет переданный файл и в зависимости от его расширения выбирает соответствующую команду распаковки.
Настройка истории Bash
В .bashrc можно настроить количество команд, которые Bash хранит в истории.
За это отвечают две переменные.
HISTSIZE определяет количество команд, сохраняемых в памяти текущей shell-сессии.
HISTFILESIZE определяет количество команд, которое сохраняется в файле ~/.bash_history.
Например:
export HISTSIZE=10000
export HISTFILESIZE=10000
export HISTCONTROL=ignoredupsПоследняя настройка позволяет игнорировать последовательные повторения одинаковых команд.
Для сохранения истории из нескольких одновременно открытых терминалов можно включить histappend:
shopt -s histappendВ этом случае новые записи добавляются в ~/.bash_history, а не перезаписывают историю при завершении shell-сессии.
Как применить изменения без перезапуска терминала
После изменения .bashrc настройки не появляются в уже запущенной shell-сессии автоматически.
Для загрузки изменений используется:
source ~/.bashrcЕсть и сокращённый вариант:
. ~/.bashrcОбе команды выполняют .bashrc в текущей shell-сессии. После этого новые алиасы, функции и переменные становятся доступными без необходимости закрывать и заново открывать терминал.
Пример .bashrc
Все рассмотренные настройки можно объединить в одном файле:
# ~/.bashrc: базовая конфигурация
# --- History Control ---
export HISTSIZE=10000
export HISTFILESIZE=10000
export HISTCONTROL=ignoredups:erasedups
shopt -s histappend
# --- Aliases ---
alias ll='ls -lha'
alias grep='grep --color=auto'
alias c='clear'
alias update='sudo apt update && sudo apt upgrade -y'
# --- Environment Variables ---
export EDITOR='nano'
# --- PATH ---
export PATH="$HOME/bin:$PATH"
# --- Custom Prompt (PS1) ---
parse_git_branch() {
git symbolic-ref --short HEAD 2>/dev/null || git rev-parse --short HEAD 2>/dev/null
}
export PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[0;31m\]\$(parse_git_branch)\[\033[00m\]\$ "
# --- Functions ---
mkcd () {
mkdir -p -- "$1" && cd -P -- "$1"
}После сохранения файла изменения можно применить командой:
source ~/.bashrcНеобязательные части конфигурации можно удалить, оставив только необходимые настройки.
Рекомендации по организации .bashrc
Перед крупными изменениями стоит создавать резервную копию:
cp ~/.bashrc ~/.bashrc.bakКонфигурацию лучше разделять на логические блоки с комментариями, например отдельно хранить алиасы, функции, переменные окружения и настройки истории.
Изменения можно сначала проверить в новом окне терминала. Если обновлённый .bashrc содержит ошибку, старую рабочую shell-сессию можно оставить открытой и исправить проблему.
Для сложных конфигураций .bashrc и другие dotfiles можно хранить в Git. Это позволяет отслеживать изменения и возвращаться к предыдущей версии.
Что делать, если .bashrc сломан
Ошибка синтаксиса в .bashrc, например незакрытая кавычка или скобка, может помешать запуску новых shell-сессий.
Для запуска Bash без пользовательских конфигурационных файлов используется:
bash --noprofile --norcЭта команда пропускает .bash_profile и .bashrc.
Если проблема точно находится только в .bashrc, достаточно:
bash --norcПосле запуска чистой shell-сессии можно открыть .bashrc, исправить ошибку или восстановить резервную копию:
cp ~/.bashrc.bak ~/.bashrcПосле этого файл снова можно загрузить через source ~/.bashrc.
Проверка .bashrc перед загрузкой
Чтобы проверить синтаксис файла без его выполнения, используется:
bash -n ~/.bashrcЕсли команда ничего не выводит, синтаксических ошибок не обнаружено. При наличии ошибки Bash укажет приблизительное место, где она находится.
Для более подробной проверки можно использовать ShellCheck:
shellcheck ~/.bashrcShellCheck способен находить не только синтаксические ошибки, но и распространённые проблемы с логикой, кавычками и переносимостью shell-кода. В Debian и Ubuntu его можно установить командой:
sudo apt install shellcheckВ Fedora и RHEL:
sudo dnf install ShellCheckЧастые ошибки
Одна из наиболее распространённых ошибок — изменение .bashrc без последующей загрузки файла. После редактирования необходимо выполнить source ~/.bashrc или открыть новую shell-сессию.
Также нельзя без необходимости заменять существующий $PATH. При добавлении нового каталога нужно сохранять старое значение:
export PATH="$HOME/bin:$PATH"Синтаксическая ошибка в .bashrc может нарушить запуск Bash, поэтому перед изменениями стоит сделать резервную копию.
Для сложных команд вместо алиасов следует использовать функции, поскольку они поддерживают аргументы, несколько последовательных операций и условную логику.