Bash
За информацията в тази статия или раздел не са посочени източници. Въпросната информация може да е непълна, неточна или изцяло невярна. Имайте предвид, че това може да стане причина за изтриването на цялата статия или раздел. |
Bash е UNIX shell написан от Брайън Фокс за проекта GNU като свободен софтуер, който да замести Bourne shell (sh).
Самото име е едновременно акроним, игра на думи и описание. Като акроним произлиза от Bourne-again shell „възродена обвивка“ или „отново обвивка на Борн“.
Въведение
[редактиране | редактиране на кода]В UNIX-базираните системи командният интерпретатор изпълнява функцията на преводач между потребителя и ядрото на операционната система. Дълго време това е бил основният и най-добър начин за работа с UNIX. За разлика от създадените много по-късно системи с графичен интерфейс като Windows и MacOS, работата с командните интерпретатори се осъществява посредством текстови команди. Те могат да бъдат външни (в отделни изпълними файлове) или вградени в интерпретатора (builtins).
Предшественици
[редактиране | редактиране на кода]Един от първите командни интерпретатори за UNIX е Bourne shell (sh). Той носи името си от своя създател Стивън Борн и е бил включен в UNIX Версия 7 през 1979 година. Друг широко разпространен интерпретатор е C shell (csh), написан от Бил Джой в Калифорнийския университет в Бъркли като част от операционната система BSD. Със синтаксис подобен на езика C, C shell е изключително удобен и лесен за научаване от UNIX програмисти. Той е несъвместим с Bourne shell. Първият съществен опит за подобряване на възможностите на Bourne shell е интерпретаторът ksh (Korn Shell). Той съчетава нови възможности и съвместимост с Bourne shell.
Роден отново
[редактиране | редактиране на кода]Създаден като част от проекта ГНУ, Bash (Bourne-Again Shell) е един от най-популярните командни интерпретатори в UNIX. Базира се на небезизвестния sh (Bourne Shell) като също така заимства функционалност от ksh (Korn Shell) и csh (C Shell).
Официално е започнат през 10 януари 1988 г. от Брайън Фокс към който по-късно се присъединява и Чет Рами. През 1995 г. Чет започва работа над Bash 2.0 официално обявен на 23 декември 1996 г. Bash посредством своя синтаксис и вградени команди предоставя възможност за програмиране. Той може да изпълнява команди както от командния ред, така и от външен файл. Синтаксисът му е един и същ независимо от къде чете командите. Мощта на програмирането на Bash не се състои толкова в ключовите му думи и конструкции, колкото в набора от десетките програми като sed, awk, grep, cut и др. които са незаменима част от UNIX.
Клавишни комбинации
[редактиране | редактиране на кода]Следните клавишни комбинации работят при употребата на настройки под подразбиране на (Emacs).
Забележка: За тези случаи, при които се включва бутона Alt, може да използвате и Esc.
- Tab ⇆ : Автоматично допълване след курсора
- Ctrl+a : скача към началото на линията на курсора (еквивалентен на Home)
- Ctrl+b : премества курсора един знак назад (еквивалентен на ←)
- Ctrl+c : изпраща SIGINT сигнал до настоящата задача, преостановявайки изплънението и затваряйки я
- Ctrl+d
- Ctrl+e : (end) moves the cursor to the line end (equivalent to the key End).
- Ctrl+f : премести курсора един знак напред (еквивалентен на →).
- Ctrl+g : преустановява търсене от историята и възстановява първоначалния ред
- Ctrl+h : изтрива предния знак (еквивалентен на натискането на backspace клавиша).
- Ctrl+i : еквивалентен на tab клавиша
- Ctrl+j : еквивалентен на enter клавиша
- Ctrl+k : изтрива съдържанието на реда след курсора и го копира в клипборда
- Ctrl+l : изтрива съдържанието на терминала (еквивалентен на
clear
). - Ctrl+n : (next) изваждане на следващата команда (еквивалентен на ↓).
- Ctrl+o : изпълнява намерената команда от историята, и изтегля следващия ред относителен на текущия ред от историята
- Ctrl+p : (previous) извежда предишната команда (еквивалентен на ↑)
- Ctrl+r : (research) извежда последната команда използвайки въведените знаци като търсещ аргумент – следващото натискане на Ctrl+r клавишна комбинация извежда следващото попадение на търсещия аргумент
- Ctrl+s : прескача обратно до следващата команда от търсенето назад в историята
- Ctrl+t : транспонира предишните два знака
- Ctrl+u : изтрива съдържанието на командния ред преди курсора и го копира в клипборда
- Ctrl+v : ако последващото въвеждане е съIf the next input is also a control sequence, type it literally (e. g. * Ctrl+v Ctrl+h types „^H“, a literal backspace.)
- Ctrl+w : Изтрива думата преди курсора и я копира в клипборда
- Ctrl+x Ctrl+e : редактира текущия команден ред в $EDITOR програмата, export VISUAL=vim
- Ctrl+x Ctrl+r : чете съдържанието на inputrc файла, and и прилага конфигурираните там клавишни комбинации, настройки и зададени стойности на променливи
- Ctrl+x Ctrl+u : Последователно премахване на последното действие (от англ. undo), отделно запаметени за всеки отделен ред
- Ctrl+x Ctrl+v : Изведи настоящата версия на bash
Навигация в Bash
[редактиране | редактиране на кода]Съществуват някои основни принципи в навигацията на шела, които след заучаването важат и за множество текстови редактори и други *nix програми. За командите man и less, както и vi важат следните клавиши.
- J – придвижване надолу
- К – придвижване нагоре
- L – придвижване надясно
- H – придвижване наляво
- Space – една страница надолу
- q – от „quit“ излизане от режима
- Ctrl+Z – скриване, преустановяване на текущата работа (job) на „фона“
- fg – връщане към скритата работа от „фона“
- clear; anotherCommand – две или повече команди могат да бъдат изпълнени на един ред, ако има ";" помежду им
Примери за синтаксиса на Bash скриптове
[редактиране | редактиране на кода]Преди да започване редакцията на файл, които ще представлява изпълним скрипт съдържащ поредица от команди на Операционната система трябва да се окаже изпълнимостта му. Т.е. ако името на файла е myFirstScript.sh, следната команда изпълнена в директорията на скрипта ще го направи изпълним:
chmod u+x myFirstScript.sh
Това може да бъде лесно проверено с командата ls -al
В случай, че се зарежда изпълним файл които съдържа Bash код, в началото му трябва да се укаже пътя към интерпретатора по следния начин:
#!/път/към/bash
За разлика от езици като C, C++, Java и др. при Bash кода не се компилира, а се интерпретира така както е подаден. Типичен пример за една Bash програма е следният:
#!/usr/local/bin/bash
echo "Здравей, Свят!"
Кодът може да се коментира с # например:
echo „hello“ # Отпечатай hello # прекъсни програмата exit
В Bash може да се създават променливи и функции. Типът на променливите не е задължителен, но при нужда може да се укаже посредством вградената команда declare. Променлива се декларира по следния начин:
ime_promenliva="stoinost na promenlivata"
И се достига със знака за низ $ в началото и. Например:
echo $ime_promenliva
Има няколко начина за създаване на фунции. Единият е чрез ключовата дума function:
function ime_funciq { # kod na funciq }
Или със скоби по следния начин:
ime_funciq() { # kod na funciq }
Функциите се извикват само с името им, без скоби или допълнителни символи в началото, например:
ime_funciq „параметър 1“ „параметър 2“ три четири 5
Параметрите подадени на функцията се разполагат от $1 до $n, където n е число и е последен параметър. Те могат да се изместват с вградената команда shift, например:
echo $1 shift 2 # $3 става $1
Логика и изрази в синтаксиса Bash
[редактиране | редактиране на кода]Цифрови сравнения
[редактиране | редактиране на кода]За простота е използвано честото съкращение int, което произлиза от англ. integer – цяло число:
int1 -eq int2 Връща True ако int1 е равно на int2 int1 -ge int2 Връща True ако int1 е по-голямо или равно на int2. int1 -gt int2 Връща True ако int1 е по-голямо от int2. int1 -le int2 Връща True ако int1 е по-малко или равно от int2 int1 -lt int2 Връща True ако int1 е по-малко от int2 int1 -ne int2 Връща True ако int1 не е равно на int2
Сравнения на низове
[редактиране | редактиране на кода]На английски string, което се съкращава str, означава низ.
str1 = str2 Връща True ако str1 е идентична на str2. str1 != str2 Връща True ако str1 не е идентична на str2. str Връща True ако str не е null (т.е. празен) -n str Връща True if дължината на str е по-голяма от null (null означава липса на стойност или нищо) -z str Връща True ако дължината на str е равна на 0. (0 е различна от null)