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
    • изпраща EOF маркер, което прекратява изпълнението на настоящия шел
    • ако има текст на настоящия ред изтрива знака под курсора (еквивалентен на Delete).
  • 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)

Външни препратки редактиране