Файл .bashrc в Linux: настройка Bash

Файл .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
~/.profile

Bash использует только первый найденный файл из этого списка.

На практике пользовательские настройки из .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 ~/.bashrc

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

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

Похожие статьи

Рекомендательные технологии Подробнее
Разработка и инструменты 5 месяцев назад

Как работать с MongoDB Shell (mongosh)

Руководство по работе с оболочкой MongoDB Shell (mongosh). В статье разобраны подключение к серверу, базовые команды, вставка и просмотр данных, а также возможности автодополнения и встроенной справки.

Разработка и инструменты 8 месяцев назад

PHP Generators

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