Bash (Русский)
Related articles
Bash (Bourne-again Shell) - это оболочка командной строки/язык программирования, созданная GNU Project. Название является отсылкой к предшественнику - давно устаревшей Bourne shell. Bash можно запустить на большинстве UNIX-like систем, включая GNU/Linux.
Contents
Обращение к Bash
Работа с Bash различается в зависимости от того каким образом она была вызвана. Далее приведены описания различных режимов работы с Bash.
Если Bash инициализирована командой login
в терминале, службой (демоном) SSH и т.п., она подразумевает под собой login-оболочку (оболочку авторизации). Этот режим также вызывается опциями -l
или--login
командной строки.
Bash является interactive-оболочкой (интерактивной оболочкой), если ее стандартные потоки ввода и ошибок направляются в терминал (например, когда запущен эмулятор терминала), а так же если она не запускается с параметром -c
либо аргументами без параметров (например, bash script
). Все interactive-оболочки берут данные из /etc/bash.bashrc
и~/.bashrc
, в то время, как login shells также ссылаются на /etc/profile
и~/.bash_profile
.
Файлы настроек
Подробное описание см. 6.2 Bash Startup Files иDotFiles.
Файл | Описание | Login-оболочки (см примечание) | Interactive-оболочки (non-login) |
---|---|---|---|
/etc/profile
|
Источники настройки приложения в /etc/profile.d/*.sh и/etc/bash.bashrc .
|
Да | Нет |
~/.bash_profile
|
Отдельно для каждого пользователя, после /etc/profile . Если этого файла не существует, идет обращение к ~/.bash_login и ~/.profile (в таком порядке). Файл-"рыба" /etc/skel/.bash_profile также берет данные из ~/.bashrc .
|
Да | Нет |
~/.bash_logout
|
После выхода из login-оболочки. | Да | Нет |
/etc/bash.bashrc
|
Зависит от флага компиляции -DSYS_BASHRC="/etc/bash.bashrc" . Берет данные из /usr/share/bash-completion/bash_completion .
|
Нет | Да |
~/.bashrc
|
Отдельно для каждого пользователя, после /etc/bash.bashrc .
|
Нет | Да |
Оболочка и переменные окружения
Поведение Bash, а так же программ, запущенных при помощи нее, может зависеть от целого ряда переменных окружения. Переменные окружения используются для хранения полезной информации, такой, как папки поиска для команды или браузер, который необходимо использовать. Когда запускается новый скрипт или оболочка, они наследуют родительские переменные окружения, таким образом, запускаясь с некоторым набором переменных оболочки [1].
Переменные оболочки в Bash могут быть экспортированы в переменные окружения:
VARIABLE=content export VARIABLE
Или с использованием сокращения:
export VARIABLE=content
Переменные окружения традиционно расположены в ~/.profile
или/etc/profile
, таким образом, все bourne-совместимые оболочки могут их использовать.
См. Переменные окружения для более подробной информации.
Командная строка
Командная строка Bash управляется отдельной библиотекой под названием Readline. Readline позволяет использовать множество удобных действий с командной оболочкой, таких, как передвижение назад и вперед по словам, удаление слов и т.п. Так же Readline отвечает за history историю введенных команд. Ну и, наконец, она позволяет вам создавать macros макросы.
Автодополнение (клавиша Tab)
Wikipedia:Автодополнение - это возможность автоматически заканчивать не полностью введенные команды путем нажатия клавиши Tab
дважды (возможность присутствует по умолчанию).
Однократное нажатие Tab
For single press Tab
results for when a partial or no completion is possible:
~/.inputrc
set show-all-if-ambiguous on
Alternatively, for results when no completion is possible:
~/.inputrc
set show-all-if-unmodified on
Дополнительные программы и опции
Bash изначально поддерживает автодополнение команд, имен файлов и переменных. Этот функционал может быть расширен при помощи пакета bash-completion; он расширяет возможности Bash, добавляя автодополнения для наиболее популярных команд и их параметров. С установленным пакетом bash-completion, однако, обычные автодополнения (такие, как $ ls file.*<tab><tab>
) будут вести себя по-другому; но они могут быть возвращены в обычный режим при помощи $ compopt -o bashdefault <prog>
(см.[2] и [3] для дополнительной информации). Так же стоит отметить, что пакет bash-completion может существенно замедлить работу на старых системах.
Настройка автодополнения вручную
Для базовых команд используйте строки вида complete -cf your_command
(это вызовет конфликт с настройками пакета bash-completion, если он установлен):
~/.bashrc
complete -cf sudo complete -cf man
История команд
Просмотр истории команд доступен по нажатию клавиш направления (вверх, вниз) (см: Readline#History иReadline Init File Syntax):
~/.bashrc
bind '"\e[A": history-search-backward' bind '"\e[B": history-search-forward'
или:
~/.inputrc
"\e[A": history-search-backward "\e[B": history-search-forward
Быстрый переход между словами при помощи клавиши Ctrl
Xterm поддерживает переход между словами при помощиCtrl+Left
иCtrl+Right
по умолчанию. Для того, чтобы это заработало в других эмуляторах терминала, найдите нужные коды терминала, и привяжите их к backward-word
и forward-word
в ~/.inputrc
. Коды можно посмотреть при помощи команды cat.
Пример для urxvt:
~/.inputrc
"\eOd": backward-word "\eOc": forward-word
Mimic Zsh run-help ability
Zsh can invoke the manual for the written command pushing Alt+h
.
A similar behaviour is obtained in Bash by appending this line in your inputrc
file:
/etc/inputrc
"\eh": "\C-a\eb\ed\C-y\e#man \C-y\C-m\C-p\C-p\C-a\C-d\C-e"
Псевдонимы
alias - это команда, которая позволяет заменить одним словом целую строку. Часто она используется для сокращения стандартных команд, а так же для добавления часто используемых аргументов к командам.
Созданные пользователем алиасы обычно хранятся в ~/.bashrc
, а общесистемные алиасы (доступные всем пользователям) - в /etc/bash.bashrc
. См. примеры алиасов на [4] и Pacman tips#Shortcuts[broken link: invalid section].
Для функций см.Bash/Functions (Русский).
Советы и рекомендации
Настройка приглашения командной строки
За приглашение командной строки Bash отвечает переменная окружения $PS1
. Чтобы раскрасить приглашение Bash в разные цвета:
~/.bashrc
#PS1='[\u@\h \W]\$ ' # Закомментируйте значение по умолчанию #DO NOT USE RAW ESCAPES, USE TPUT reset=$(tput sgr0) red=$(tput setaf 1) blue=$(tput setaf 4) green=$(tput setaf 2) PS1='\[$red\]\u\[$reset\] \[$blue\]\w\[$reset\] \[$red\]\$ \[$reset\]\[$green\] '
Этот вариант $PS1
полезен для приглашения командной строки root (красное обозначение и зеленый текст консоли). Символы \[
и \[
"оборачивают" непечатные символы для того, чтобы избежать неправильного отображения приглашения. Для дополнительной информации см.: Color Bash Prompt.
Кастомизация заголовка
Переменная $PROMPT_COMMAND
позволяет запускать команду до приглашения командной строки. Например, такой вариант добавит в заголовок полный путь к текущей папке:
~/.bashrc
export PROMPT_COMMAND='echo -ne "\033]0;$PWD\007"'
А вот так можно изменить заголовок на имя последней запущенной команды и убедиться, что ваш файл истории команд всегда в актуальном состоянии:
~/.bashrc
export HISTCONTROL=ignoreboth export HISTIGNORE='history*' export PROMPT_COMMAND='history -a;echo -en "\e]2;";history 1|sed "s/^[ \t]*[0-9]\{1,\} //g";echo -en "\e\\";'
Команда не найдена (AUR)
pkgfile включает хук "команда не найдена", который автоматически ищет в официальных источниках команды, похожие на ту, что не была распознана системой. Альтернативный хук "команда не найдена" имеется в репозитории AUR command-not-foundAUR. пример использования:
$ abiword
The command 'abiword' is been provided by the following packages: abiword (2.8.6-7) from extra [ abiword ] abiword (2.8.6-7) from staging [ abiword ] abiword (2.8.6-7) from testing [ abiword ]
Для автоматического запуска:
~/.bashrc or ~/.zshrc
[ -r /etc/profile.d/cnf.sh ] && . /etc/profile.d/cnf.sh
Отключение Ctrl-z в терминале
Вы можете отключить сочетание Ctrl+z
(приостанавливает/закрывает текущую программу), например, так:
#!/bin/bash trap "" 20 adom
Теперь, если вы случайно нажмете Ctrl+z
в adomAUR вместо Shift+z
, ничего не произойдет, потому что Ctrl+z
будет проигнорировано.
Очистка экрана после выхода из системы
Чтобы очистить экран после выхода из виртуального терминала:
~/.bash_logout
clear reset
Автоматическая смена директории (cd) при вводе только пути
Bash может автоматически подставлять cd
при вводе только пути в командной строке.
Например:
$ /etc
bash: /etc: Is a directory
Но после добавления одной строки в .bashrc
:
~/.bashrc
... shopt -s autocd ...
Вы получите:
[user@host ~]$ /etc cd /etc [user@host etc]$
Autojump
autojump позволяет перемещаться по файловой системе при помощи поиска строк в базе данных наиболее часто посещаемых пользователем путей.
После установки, файл /etc/profile.d/autojump.bash
должен быть добавлен в source для того, чтобы программа начала работать.
Решение проблем
Перенос строк при изменении размера окна
При изменении размера окна terminal emulator, Bash может не получить этот сигнал. Из-за этого введенный текст может неправильно перенестись и перекрыть собой приглашение командной строки. Опция командной строки checkwinsize
проверяет размер окна при вводе каждой команды и, если это необходимо, обновляет значения переменных LINES
и COLUMNS
.
~/.bashrc
shopt -s checkwinsize
Происходит выход из оболочки даже при установленном ignoreof
Если вы установили параметр ignoreeof
, но повторное нажатие ctrl-d
вызывает выход из оболочки, это происходит потому, что параметр ignoreof позволяет произвести только 10 последовательных нажатий этого сочетания клавиш (10 последовательных символов EOF, если быть точным) перед тем, как выйти из оболочки.
Чтобы установить бОльшее значение, нужно использовать переменную IGNOREOF.
Например:
export IGNOREEOF=100
См. также
- Bash Reference
- Bash manual page
- Readline Init File Syntax
- The Bourne-Again Shell - The third chapter of The Architecture of Open Source Applications
- Shellcheck - Check bash scripts for common errors
Туториалы
- BashGuide on Greg's Wiki
- BashFAQ on Greg's Wiki
- Bash Hackers Wiki
- Advanced Bash Scripting Guide
- Quote Tutorial