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

Повʼязані статті
Bash/Функції
Bash/Налаштування запрошення
Command-line shell (Українська)
Змінні середовища
Fortune
Pkgfile
Readline
Bash
(
B
ourne-
A
gain
SH
ell) — це
командна оболонка
та мова програмування від
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-git
AUR
- редактор командного рядка, який написаний на чистому Bash і призначений замінити Readline. Пропонує безліч додаткових можливостей на кшталт підсвітки синтаксису, підказок, завершення команд з меню, що випадає, абревіатур, режиму редагування
Vim
, хук-функцій тощо.
Після встановлення необхідно
зчитати і виконати
його в інтерактивному сеансі. Налаштування докладно пояснюються у файлі
~/.blerc
і
wiki
. Доступна також стабільна збірка
blesh
AUR
.
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
Якщо після цього під час роботи
adom
AUR
ви помилково замість
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-git
AUR
дозволяє переміщатися по файловій системі за допомогою пошуку рядків у базі даних з часто відвідуваними шляхами. Щоб додаток запрацював, після встановлення необхідно
зчитати і виконати
файл
/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