Bash (Українська)
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
.
/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 |
- Оболонки входу можуть бути неінтерактивними, якщо їх викликати з аргументом
--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]).
Налаштування для команд
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
Вимкнення комбінації 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