Bash (Русский)

From ArchWiki
Jump to: navigation, search

Tango-preferences-desktop-locale.pngЭта статья или раздел нуждается в переводеTango-preferences-desktop-locale.png

Примечания: Перевод устарел (обсуждение: Talk:Bash (Русский)#)

Tango-preferences-desktop-locale.pngЭта страница нуждается в сопроводителеTango-preferences-desktop-locale.png

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков ArchWiki

Bash (Bourne-again Shell) - это оболочка командной строки/язык программирования, созданная GNU Project. Название является отсылкой к предшественнику - давно устаревшей Bourne shell. Bash можно запустить на большинстве UNIX-like систем, включая GNU/Linux.

Обращение к 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.


Note: В Arch Linux файл /bin/sh (который раньше был файлом запуска Bourne shell) символически ссылается на /bin/bash. Если Bash вызывается при помощи sh, Arch Linux пытается имитировать старый sh, включая совместимость с POSIX

Файлы настроек

Подробное описание см. 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. Нет Да
Note:
  • Login-оболочки могут быть неинтерактивными (non-interactive), если вызываются при помощи аргумента --login..
  • Будучи интерактивными, non-login-оболочки не берут данные из ~/.bash_profile, они по-прежнему наследуют окружение от родительских процессов (которые могут быть login-оболочками). См. On processes, environments and inheritance для получения дополнительной информации.

Оболочка и переменные окружения

Поведение Bash, а так же программ, запущенных при помощи нее, может зависеть от целого ряда переменных окружения. Переменные окружения используются для хранения полезной информации, такой, как папки поиска для команды или браузер, который необходимо использовать. Когда запускается новый скрипт или оболочка, они наследуют родительские переменные окружения, таким образом, запускаясь с некоторым набором переменных оболочки [1].

Переменные оболочки в Bash могут быть экспортированы в переменные окружения:

VARIABLE=content
export VARIABLE

Или с использованием сокращения:

export VARIABLE=content

Переменные окружения традиционно расположены в ~/.profile или/etc/profile, таким образом, все bourne-совместимые оболочки могут их использовать.

См. Переменные окружения для более подробной информации.

Командная строка

Командная строка Bash управляется отдельной библиотекой под названием Readline. Readline позволяет использовать множество удобных действий с командной оболочкой, таких, как передвижение назад и вперед по словам, удаление слов и т.п. Так же Readline отвечает за history историю введенных команд. Ну и, наконец, она позволяет вам создавать macros макросы.

Автодополнение (клавиша Tab)

Wikipedia:ru:Автодополнение - это возможность автоматически заканчивать не полностью введенные команды путем нажатия клавиши 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

См. также

Туториалы

Сообщество

Примеры