Jump to content

# Bash (Українська)

From ArchWiki

Повʼязані статті

- Bash/Функції
- Bash/Налаштування запрошення
- Command-line shell (Українська)
- Змінні середовища
- Fortune
- Pkgfile
- Readline

Bash (Bourne-Again SHell) — це командна оболонка та мова програмування від GNU Project. Її назва натякає на попередника — давно застарілу Bourne shell. Bash можна запускати на більшості Unix-подібних операційних систем, зокрема на GNU/Linux.

Bash є типовою командною оболонкою в Arch Linux.

## Виклик

Робота Bash може змінюватися залежно від способу її виклику. Далі наведено опис різних режимів.

Якщо Bash запускається через `login` у TTY, через демон SSH або подібним чином, вона вважається оболонкою входу. Цей режим також можна увімкнути за допомогою параметра командного рядка `-l`/`--login`.

Bash вважається інтерактивною оболонкою, якщо її стандартний вхід, вихід та помилки підключені до терміналу (наприклад, коли вона запущена у термінальному емуляторі) і якщо вона не була запущена з параметром `-c` або без аргументів (наприклад, `bash скрипт`). Усі інтерактивні оболонки виконують `/etc/bash.bashrc` та `~/.bashrc`, тоді як інтерактивні оболонки входу також виконують `/etc/profile` і `~/.bash_profile`.

Note У Arch `/bin/sh` (який раніше був виконуваним файлом Bourne shell) є символічним посиланням на `bash`. Якщо Bash викликається під ім’ям `sh`, вона намагається імітувати поведінку запуску історичних версій `sh`, включаючи сумісність із POSIX.

### Конфігураційні файли

Bash намагатиметься виконати набір стартових файлів залежно від способу виклику. Див. розділ Bash Startup Files у керівництві GNU Bash для повного опису.

Файл | Опис | Оболонки входу (див. примітку) | Інтерактивні не-оболонки входу
--- | --- | --- | ---
`/etc/profile` | Source застосовує налаштування з `/etc/profile.d/*.sh` та `/etc/bash.bashrc`. | Yes | No
`~/.bash_profile` | Персональний, виконується після `/etc/profile`. Якщо цей файл відсутній, перевіряються `~/.bash_login` і `~/.profile` у такому порядку. Файл-скелет `/etc/skel/.bash_profile` також застосовує `~/.bashrc`. | Yes | No
`~/.bash_logout` | Персональний, виконується після виходу з оболонки входу. | Yes | No
`/etc/bash.bash_logout` | Залежить від прапорця компіляції `-DSYS_BASH_LOGOUT="/etc/bash.bash_logout"`. Виконується після виходу з оболонки входу. | Yes | No
`/etc/bash.bashrc` | Залежить від прапорця компіляції `-DSYS_BASHRC="/etc/bash.bashrc"`. Виконує `/usr/share/bash-completion/bash_completion`. | No | Yes
`~/.bashrc` | Персональний, виконується після `/etc/bash.bashrc`. | No | Yes

Note

- Оболонки входу можуть бути неінтерактивними, якщо їх викликати з аргументом `--login`.
- Хоча інтерактивні не-оболонки входу не виконують `~/.bash_profile`, вони все одно успадковують середовище від батьківського процесу (який може бути оболонкою входу). Див. GregsWiki:ProcessManagement#On processes, environments and inheritance для деталей.

### Змінні оболонки та середовища

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

Ці змінні оболонки в Bash можна експортувати, щоб вони стали змінними середовища:

    VARIABLE=content
    export VARIABLE

або за допомогою скороченого запису:

    export VARIABLE=content

Змінні середовища зазвичай розміщуються в `~/.profile` або `/etc/profile`, щоб їх могли використовувати інші оболонки, сумісні з Bourne.

Див. Змінні середовища для загальної інформації.

## Командний рядок

Командний рядок Bash працює під керуванням бібліотеки Readline. Readline дозволяє використовувати комбінації клавіш в стилі emacs та vi для взаємодії з командним рядком, наприклад для переміщення вперед та назад по словах, видаленні слів і тд.До того ж Readline відповідає за зберігання виконаних команд, та створювати макроси.

### Автодоповнення команд

Автодоповнення (tab completion) — завершення введених команд натисканням клавіші `Tab` (є усталеним налаштуванням).

#### Одинарне натискання

Вивести список можливих закінчень для частково введеної команди можна декількома повторними натисканням клавіші `Tab` - іноді двома та трьома. В статті Readline #Швидке завершення описано, як зменшити кількість натискань до одного.

#### Додаткові програми та опції

Усталено Bash дозволяє виконувати команди, імена файлів та змінні.Пакет bash-completion додає автодоповнення для найпоширеніших команд та їхніх опцій, які можна ввімкнути, зчитавши і виконавши файл `/usr/share/bash-completion/bash_completion` (зазвичай зчитується автоматично в `/etc/bash.bashrc`). З пакетом bash-completion звичайні завершення (на кшталт `$ ls file.*<tab><tab>`) поводитимуться дещо інакше, повернути стару поведінку можна командою `$ compopt -o bashdefault програма` (докладніше див. [2] і [3]).

#### Налаштування для команд

Примітка Вбудована команда Bash `complete` може конфліктувати з bash-completion.

Типово Bash допомагає завершувати тільки імена файлів, які слідують за командою. Це можна переналаштувати командою `complete -c`, щоб доповнювалися і певні команди:

    ~/.bashrc

    complete -c man which

З прапорами `-cf` завершуватися будуть і команди, і імена файлів після них:

    complete -cf sudo

Інші опції та автодоповнення можна знайти в посібнику Bash.

### Історія команд

#### Автодоповнення на основі історії команд

Клавіші стрілок "вверх" та "вниз" можна призначити для пошуку команд в історії (див. Readline #Історія команд та Синтаксис init-файлів Readline):

    ~/.bashrc

    bind '"\e[A": history-search-backward'
    bind '"\e[B": history-search-forward'

Або, щоб це працювало у всіх програмах Readline:

    ~/.inputrc

    "\e[A": history-search-backward
    "\e[B": history-search-forward

#### Стиснення історії команд

Змінна `HISTCONTROL` дозволяє запобігти логуванню деяких команд. Наприклад, щоб однакові команди не потрапляли в історію, надайте змінній таке значення:

    ~/.bashrc

    export HISTCONTROL=ignoredups

Якщо ж задати значення `erasedups`, то додатково з історії будуть видалені вже наявні дублікати команд. Докладніше див. посібник Bash.

#### Вимкнення історії

Щоб тимчасово вимкнути історію, виконайте:

    $ set +o history

Тепер можна виконувати «чутливі» в плані безпеки дії, на кшталт обчислення хеш-суми пароля (`printf secret | sha256sum`) або роботи з GPG (`gpg -eaF secret-pubkey.asc`), не побоюючись, що секретний ключ буде збережено на диск.

Увімкнути історію назад можна командою

    $ set -o history

Порада Якщо змінна `HISTCONTROL` має значення `ignorespace`, команди, що починаються з пробілу, не зберігатимуться у файл історії. Докладніше див. bash(1) § Shell Variables.

Щоб вимкнути всю історію Bash:

    ~/.bashrc або /etc/profile

    export HISTSIZE=0

Після цього команди, що вводяться, не будуть зберігатися в `$HISTFILE`.

Після необхідно видалити старий файл історії (майте на увазі - команди нижче видалять його безповоротно):

    $ wipe -i -l2 -x4 -p4 "$HISTFILE"
    $ ln -sv /dev/null "$HISTFILE"

### run-help из Zsh

В Zsh є можливість викликати довідку для команди перед курсором за допомогою комбінації клавіш `Alt+h`. В Bash те ж можна зробити з допомогою прив'язки клавіш в Readline:

    ~/.bashrc

    run-help() { help "$READLINE_LINE" 2>/dev/null || man "$READLINE_LINE"; }
    bind -m vi-insert -x '"\eh": run-help'
    bind -m emacs -x     '"\eh": run-help'

Передбачається, що ви використовуєте (стандартний) режим редагування Emacs.

## Псевдоніми

alias (англ. псевдонім) - команда для заміни одного рядка на інший. Часто використовується для скорочення системних команд до абревіатур або для додавання стандартних аргументів до часто використовуваних команд.

Користувацькі псевдоніми зберігаються у файлі `~/.bashrc`, а системні (для всіх користувачів) - у `/etc/bash.bashrc`. Приклади можна подивитися в [4].

Функції Bash докладно описані в Bash/Функції.

## Поради та рекомендації

### Налаштування запрошення

Див. Bash/Налаштування запрошення.

### Підсвітка синтаксису та підказки

blesh-gitAUR - редактор командного рядка, який написаний на чистому Bash і призначений замінити Readline. Пропонує безліч додаткових можливостей на кшталт підсвітки синтаксису, підказок, завершення команд з меню, що випадає, абревіатур, режиму редагування Vim, хук-функцій тощо.

Після встановлення необхідно зчитати і виконати його в інтерактивному сеансі. Налаштування докладно пояснюються у файлі ~/.blerc і wiki. Доступна також стабільна збірка bleshAUR.

### Command not found

У pkgfile є хук «command not found», який при введенні невідомої команди автоматично шукає відповідний виконуваний файл у пакетах в офіційних репозиторіях.

Щоб хук запрацював, його необхідно зчитати і виконати:

    ~/.bashrc

    source /usr/share/doc/pkgfile/command-not-found.bash

Після цього при спробі запустити недоступну команду буде виведено таку інформацію:

    $ abiword

    abiword may be found in the following packages:
      extra/abiword 3.0.1-2 /usr/bin/abiword

Примітка Передньо необхідно оновити базу даних pkgfile. Детальніше див. pkgfile#Installation.

### Вимкнення комбінації Ctrl+z

Натискання `Ctrl+z` в терміналі ставить додаток на паузу або закриває його. Вимкнути цю комбінацію клавіш можна таким чином:

    #!/bin/bash
    trap «» 20
    adom

Якщо після цього під час роботи adomAUR ви помилково замість `Shift+z` натиснете комбінацію `Ctrl+z`, то її буде проігноровано і нічого не станеться.

### Очищення екрана після виходу

Очищення екрана віртуального терміналу після виходу:

    ~/.bash_logout

    clear
    reset

### Зміна каталогу при введенні шляху

Bash може автоматично додавати команду `cd` , якщо введено тільки шлях до каталогу. Стандартна поведінка:

    $ /etc

    bash: /etc: Is a directory

Якщо ж додати в `.bashrc` рядок

    ~/.bashrc

    ...
    shopt -s autocd
    ...

то станеться наступне:

    [user@host ~]$ /etc
    cd /etc
    [user@host etc]$

### Autojump

autojump-gitAUR дозволяє переміщатися по файловій системі за допомогою пошуку рядків у базі даних з часто відвідуваними шляхами. Щоб додаток запрацював, після встановлення необхідно зчитати і виконати файл `/etc/profile.d/autojump.bash`.

### Заборона на перезапис файлів

Вимкнення перезапису файлів за допомогою перенаправлення виведення на час поточного сеансу:

    $ set -o noclobber

Команда `set -C` зробить те ж саме.

Зробити зміни постійними можна таким чином:

    ~/.bashrc

    set -o noclobber

Примусово перезаписати файл при встановленому `noclobber`:

    $ echo "output" >| file.txt

## Вирішення проблем

### Перенесення рядків при зміні розміру вікна

При зміні розміру вікна емулятора терміналу Bash може не отримати відповідний сигнал. У результаті виведений текст буде переноситися некоректно і перекриє запрошення командного рядка. Опція оболонки `checkwinsize` перевіряє розмір вікна після кожної команди і за необхідності оновлює значення змінних `LINES` і `COLUMNS`.

    ~/.bashrc

    shopt -s checkwinsize

### Оболонка завершується навіть з опцією ignoreeof

Після завдання опції `ignoreeof` ви можете виявити, що багаторазове натискання `Ctrl-d` все одно призводить до завершення процесу оболонки. Річ у тім, що за замовчуванням ця опція дозволяє ігнорувати тільки 10 натискань цієї комбінації клавіш (якщо бути точним - 10 станів EOF) перед виходом з оболонки.

Задати більше значення можна змінною IGNOREEOF. Наприклад:

    export IGNOREEOF=100

### Аналіз сценарію та пошук помилок

Програма shellcheck перевіряє сценарії Bash (та інших командних оболонок) на предмет помилок і пропонує можливі поліпшення коду.

Існує також веб-сайт shellcheck.net, розроблений на основі однойменної програми і призначений для тієї ж мети.

## Дивіться також

- Wikipedia:uk:Bash
- Довідковий посібник Bash, також локально у файлі `/usr/share/doc/bash/bashref.html`
- Синтаксис init-файлів Readline
- The Bourne-Again Shell - Третій розділ книги The Architecture of Open Source Applications
- PS1 generator - Наочне створення запрошення Bash за допомогою миші
- Корисні команди для .bashrc

### Навчання

- Greg's Wiki
- GregsWiki:BashGuide
- GregsWiki:BashFAQ
- Quote Tutorial

### Спільнота

- Активний і доброзичливий IRC-канал Bash

### Приклади

- Як змінити назву вікна xterm

Categories:

- Command-line shells (Українська)
- GNU (Українська)

Bash (Українська)
Add topic