Глиф Учебники

Урок 7. Переменные окружения, PATH, .bashrc и alias

Курс «Командная строка Linux» · урок 7 из 10 · 4 минуты чтения

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

Переменные оболочки

Терминал
$ city=Минск
$ echo $city
Минск
$ echo "Город: $city"
Город: Минск
$ echo 'Город: $city'
Город: $city

Окружение и export

Обычная переменная видна только в текущей оболочке. Программы, которые оболочка запускает, получают лишь переменные окружения — отмеченные командой export:

Терминал
$ greeting=Привет
$ bash -c 'echo "[$greeting]"'
[]
$ export greeting
$ bash -c 'echo "[$greeting]"'
[Привет]

bash -c запускает новую оболочку с одной командой. Пока переменная не экспортирована, новая оболочка её не видит. Задать и экспортировать можно сразу: export EDITOR=nano.

Текущая оболочка только здесь city=Минск окружение HOME=/home/ivan LANG=ru_RU.UTF-8 greeting=Привет export Запущенная программа bash -c 'echo "[$greeting]"' окружение HOME=/home/ivan LANG=ru_RU.UTF-8 greeting=Привет city не видна копия
Запущенная программа получает копию окружения оболочки: переменную greeting после export она видит, а обычную переменную city — нет.

Переменную можно передать и одной команде — написав её перед командой:

Bash
LC_ALL=C ls /nonexistent

Здесь сообщение об ошибке будет на английском, хотя система русская. Удобно, когда текст ошибки нужно найти в интернете: на английском ответов больше.

Все переменные окружения показывают env и printenv, одну — printenv HOME или echo $HOME.

Важные переменные

ПеременнаяЧто хранит
HOMEдомашняя папка, например /home/ivan
USERимя пользователя
PWDтекущая папка
SHELLоболочка, которая запускается при входе
PATHпапки, где оболочка ищет программы
LANGязык и кодировка сообщений, например ru_RU.UTF-8
EDITORредактор, который открывают другие программы (crontab -e, git commit)

PATH — где оболочка ищет программы

Когда вы набираете ls, оболочка не обыскивает весь диск. Она перебирает папки из PATH — по порядку, через двоеточие — и запускает первую найденную программу с таким именем:

Терминал
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ which ls
/usr/bin/ls

У вас список может быть длиннее. which показывает, какой файл запустится; type ls скажет ещё, не сокращение ли это и не встроенная ли команда. Если программы нет ни в одной папке из PATH, оболочка пишет command not found.

Поэтому свой скрипт из текущей папки запускают с путём: ./backup.sh. Текущей папки в PATH нет — так задумано, чтобы чужой файл с именем ls в какой-нибудь папке не запустился вместо настоящей команды.

папки из $PATH — по порядку ls backup.sh 1 /usr/local/sbin 2 /usr/local/bin 3 /usr/sbin 4 /usr/bin 5 /sbin 6 /bin найдена — дальше не ищет запускает /usr/bin/ls command not found текущей папки в списке нет — свой скрипт: ./backup.sh
Оболочка перебирает папки из PATH по порядку: ls находится в /usr/bin и запускается, а backup.sh нет ни в одной папке, и выходит command not found.

Добавить свою папку в начало списка:

Bash
export PATH="$HOME/bin:$PATH"

Не забывайте $PATH в конце. Команда export PATH=$HOME/bin заменит весь список одной папкой, и в этом терминале перестанут находиться ls, nano и остальные программы. Помогает новое окно терминала, если ошибка не попала в .bashrc.

Как сделать это навсегда — ниже и в справке Как добавить папку в PATH.

Файл .bashrc

Всё, что вы задаёте командами, живёт до закрытия терминала. Чтобы настройка действовала всегда, её записывают в файл ~/.bashrc: bash читает его при открытии каждого нового окна терминала.

Bash
cp ~/.bashrc ~/.bashrc.bak
nano ~/.bashrc

Сначала копия — на случай ошибки. Допишите свои строки в конец файла, сохраните, и примените без перезапуска терминала:

Bash
source ~/.bashrc

source (или просто точка: . ~/.bashrc) выполняет файл в текущей оболочке.

При входе в систему — по SSH или в текстовой консоли — bash читает другой файл: ~/.bash_profile, а если его нет, ~/.profile. В Ubuntu, Debian и Mint ~/.profile сам подключает ~/.bashrc, поэтому настройки из .bashrc действуют и по SSH. Если вы создали ~/.bash_profile, ~/.profile читаться перестанет.

новое окно терминала вход по SSH или в консоли ~/.bash_profile ~/.profile если нет ~/.bash_profile в Ubuntu, Debian и Mint подключает ~/.bashrc ~/.bashrc настройки: export, alias source ~/.bashrc сразу, в открытом терминале
Bash в новом окне терминала читает ~/.bashrc, при входе по SSH — ~/.bash_profile или ~/.profile, который подключает ~/.bashrc, а source ~/.bashrc выполняет файл сразу.

Ошибка в .bashrc покажется сообщением при открытии каждого терминала. Работать это обычно не мешает: откройте файл в nano, исправьте строку или верните копию командой cp ~/.bashrc.bak ~/.bashrc.

alias — свои короткие команды

Alias (псевдоним) — короткое имя для длинной команды:

Bash
alias ll='ls -alF'
alias ..='cd ..'
alias ports='sudo ss -tlnp'

После этого ll работает как ls -alF. В Ubuntu и Mint ll уже задан в стандартном .bashrc. Команда alias без аргументов показывает все сокращения, unalias ll удаляет одно. Чтобы сокращения не пропадали, допишите их в ~/.bashrc.

Если alias назван как настоящая команда, а нужна именно она, поставьте перед именем обратную косую черту: \ls запустит ls без сокращения. Сокращения действуют только в терминале: в скриптах их нет.

Коротко

Проверьте себя

1. Почему команда city = Минск выдаёт command not found?
2. Что выведет echo 'Путь: $HOME'?
3. Какая команда правильно добавляет папку ~/bin в PATH?
4. Вы дописали alias в ~/.bashrc, но в открытом терминале он не работает. Что сделать?