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
    • изпраща 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)

Външни препратки[редактиране | редактиране на кода]