Bash (Русский) - ArchWiki

# Bash (Русский)

From ArchWiki

Related articles

- Bash/Functions
- Environment variables
- Readline
- Color Bash Prompt
- Fortune
- Pkgfile

Эта статья или раздел нуждается в переводе

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

Эта страница нуждается в сопроводителе

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков 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

## См. также

- 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

### Сообщество

- An active and friendly IRC channel for Bash
- Bashscripts.org

### Примеры

- How to change the title of an xterm

Categories:

- Command shells (Русский)
- Русский

Hidden category:

- Pages with broken section links