Jump to content

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

From ArchWiki

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, розроблений на основі однойменної програми і призначений для тієї ж мети.

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

Навчання

Спільнота

Приклади