Урок 7. Переменные окружения, PATH, .bashrc и alias
Оболочка хранит настройки в переменных — именованных значениях. В одних лежит ваше имя и домашняя папка, в других — список папок с программами или язык сообщений. Понимать переменные нужно и для настройки терминала, и для скриптов.
Переменные оболочки
$ city=Минск
$ echo $city
Минск
$ echo "Город: $city"
Город: Минск
$ echo 'Город: $city'
Город: $city- Присваивание —
имя=значение, без пробелов вокруг=. Командаcity = Минск— ошибка: оболочка ищет программу с именемcityи пишетcommand not found. - Значение берётся знаком
$:$cityили${city}. Фигурные скобки нужны, когда сразу за именем идут буквы:"${city}_backup". - В двойных кавычках переменные подставляются, в одинарных — нет: текст остаётся как есть.
- Значение с пробелами — в кавычках:
name="Иван Петров". unset cityудаляет переменную.
Окружение и export
Обычная переменная видна только в текущей оболочке. Программы, которые оболочка запускает, получают лишь переменные окружения — отмеченные командой export:
$ greeting=Привет
$ bash -c 'echo "[$greeting]"'
[]
$ export greeting
$ bash -c 'echo "[$greeting]"'
[Привет]bash -c запускает новую оболочку с одной командой. Пока переменная не экспортирована, новая оболочка её не видит. Задать и экспортировать можно сразу: export EDITOR=nano.
Переменную можно передать и одной команде — написав её перед командой:
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 в какой-нибудь папке не запустился вместо настоящей команды.
Добавить свою папку в начало списка:
export PATH="$HOME/bin:$PATH"Не забывайте $PATH в конце. Команда export PATH=$HOME/bin заменит весь список одной папкой, и в этом терминале перестанут находиться ls, nano и остальные программы. Помогает новое окно терминала, если ошибка не попала в .bashrc.
Как сделать это навсегда — ниже и в справке Как добавить папку в PATH.
Файл .bashrc
Всё, что вы задаёте командами, живёт до закрытия терминала. Чтобы настройка действовала всегда, её записывают в файл ~/.bashrc: bash читает его при открытии каждого нового окна терминала.
cp ~/.bashrc ~/.bashrc.bak
nano ~/.bashrcСначала копия — на случай ошибки. Допишите свои строки в конец файла, сохраните, и примените без перезапуска терминала:
source ~/.bashrcsource (или просто точка: . ~/.bashrc) выполняет файл в текущей оболочке.
При входе в систему — по SSH или в текстовой консоли — bash читает другой файл: ~/.bash_profile, а если его нет, ~/.profile. В Ubuntu, Debian и Mint ~/.profile сам подключает ~/.bashrc, поэтому настройки из .bashrc действуют и по SSH. Если вы создали ~/.bash_profile, ~/.profile читаться перестанет.
Ошибка в .bashrc покажется сообщением при открытии каждого терминала. Работать это обычно не мешает: откройте файл в nano, исправьте строку или верните копию командой cp ~/.bashrc.bak ~/.bashrc.
alias — свои короткие команды
Alias (псевдоним) — короткое имя для длинной команды:
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 без сокращения. Сокращения действуют только в терминале: в скриптах их нет.
Коротко
имя=значение— без пробелов;$имя— значение; в"…"подставляется, в'…'— нет.exportделает переменную видимой для запускаемых программ;envпоказывает окружение.PATH— папки с программами; добавлять —export PATH="папка:$PATH", не теряя$PATH.~/.bashrc— настройки каждого нового терминала; применить сразу —source ~/.bashrc.alias коротко='длинная команда'— свои сокращения, навсегда — в.bashrc.