Bash

Z Multimediaexpo.cz

Screenshot bashe na OS Gentoo Linux

Bash je v informatice název unixového shellu, který vytváří interpret pro příkazový řádek. Bash naprogramoval Brian Fox pro projekt GNU. Název je akronym pro Bourne again shell, což poukazuje na jeho základ v dříve nejpoužívanějším unixovém shellu Bourne shell (sh). Někdy se tento název také uvádí jako slovní hříčka odkazující na křesťanské znovuzrození (anglicky born again) nebo jako stlučení (anglicky bashing) všech výhod sh, csh and ksh.

Obsah

Historie

Brian Fox začal pracovat na na Bashi 10. ledna 1988 poté, co začal být Richard Stallman nespokojený s pomalým postupem jeho hlavního vývojáře shellu. Stallman a celá jeho nadace Free Software Foundation (FSF) považovaly volně šiřitelný bash, který dokáže zpracovat již existující skripty pro sh, za tak klíčový a důležitý pro dokončení jejich volně šiřitelného systému postaveného na BSD a GNU kódu, že se tento projekt stal jedním z mála, které FSF financovala z vlastních zdrojů a Brian Fox se stal vedoucím tohoto projektu a zaměstnancem FSF. První betaverzi číslo .99 vydal Brian Fox 7. června 1989 a zůstal v pozici hlavního správce projektu Bash až do první poloviny roku 1994, kdy byl z FSF propuštěn a odpovědnost za projekt převzal jeho bývalý spolupracovník Chet Ramey.

Vlastnosti

Bash je POSIX shell s řadou rozšíření. Je koncipován pro operační systémy založené na projektu GNU a je možné ho spustit na většině unixových operačních systémů. Je používán jako implicitní příkazový interpret v systémech postavených na linuxovém jádře, stejně jako i v Mac OS X nebo v systému Darvin. Je možné ho použít i v systému Microsoft Windows za použití subsystému pro unixové aplikace (SUA), nebo emulace POSIX pomocí softwaru Cygwin a MSYS. Projekt DJGPP jej pak umožňuje pustit i v systému DOS.

Základ syntaxe příkazů v Bashi je převzat z původního Bourne shellu. Také převážná většina sh skriptů je v Bashi spustitelná bez jakékoliv modifikace kódu až na pár výjimek, které vznikají jinou interpretací méně používané syntaxe příkazů nebo jinou implementací těchto systémových příkazů. Bash navíc převzal nápady z Korn shellu (ksh) a C shellu (csh), jako jsou například editace jednotlivých řádků, historii příkazů, proměnné $RANDOM a $PPID a POSIXové dynamické vkládání příkazů pomocí syntaxe $(…). Při psaní syntaxe nám pak práci nejvíce ulehčí stisk klávesy tabulátor, čímž Bash automaticky doplní konec napsaného příkazu, cesty k souboru nebo proměnné, případně nám ukáže všechny možnosti doplnění.

Na rozdíl od Bourne shellu má Bash mnoho rozšíření i v syntaxi příkazů. Například dokáže provádět celočíselné operace bez volaní externích procesů. Za tímto účelem byla vytvořena syntaxe ((…)) (pro příkaz) a $((…)) (pro proměnnou). Bash také zjednodušil přesměrování vstupů a výstupů tak, jak to v tradičním Bourn shellu nebylo možné. Například přesměrování standardního výstupu a standardního chybového výstupu v tu samou chvíli lze udělat operátorem &>.

Bash podporuje také here dokumenty stejně jako Bourne shell. Nicméně od verze 2.05b dokáže Bash přesměrovat standardní vstup z „here-řetězce“ pomocí operátoru <<<.

Bash verze 3.0 podporuje regulární výrazy se syntaxí podobnou Perlu.

Bash verze 4.0 podporuje asociativní pole, která umožňují vytvářet náhradu za vícerozměrná pole:

declare -A a             # deklaruje asociativní pole 'a'
i=1; j=2                 # initializuje nějaké proměnné s hodnotami
a[$i,$j]=5               # asociuje hodnotu "5" s klíči "$i,$j" (neboli "1,2")
echo ${array[$i,$j]}     # vypíše uložené hodnoty na klíčích "$j,$j"

Expanze závorek

Expanze závorek (anglicky brace expansion, též záměna) je vlastnost zkopírovaná z C shellu, která generuje množinu možných kombinací. Výsledky nemusí být v pořadí, jak je uvedeno v příkladu:

echo a{p,c,d,b}e # ape ace ade abe
echo {a,b,c}{d,e,f} # ad ae af bd be bf cd ce cf

Toto rozšíření by nemělo být použito v přenositelných skriptech, protože Bourne shell nevytvoří stejný výstup.

# Klasický shell nevytvoří stejný výstup, expanzi nepodporuje
echo a{p,c,d,b}e # a{p,c,d,b}e

Pokud je expanze použita v kombinaci se zástupnými znaky, nejdříve se provede expanze a poté se teprve nahradí zástupné znaky. Výpis souborů s obrázky typu JPEG a PNG pak může vypadat následovně:

ls *.{jpg,jpeg,png}    # rozšíří na *.jpg *.jpeg *.png - a poté,
                       # se vyhledají soubory odpovídající zástupným znakům

Startovací skripty

Když Bash startuje, vykoná příkazy v několika různých skriptech.

Pokud je spuštěn za účelem přihlášení uživatele (login shell), nejdříve vykoná příkazy ze souboru /etc/profile, pokud takovýto soubor existuje. Následně vyhledá skriptovací soubory ~/.bash_profile, ~/.bash_login a ~/.profile (v tomto pořadí) a pokud je soubor nalezen a je povoleno z něj číst, provede příslušný skript.

Pokud je uživatel ze shellu odhlášen, vyhledá se a provede se skript ze souboru ~/.bash_logout, pokud existuje.

Pokud je Bash spuštěn bez přihlášení uživatele, vykonají se skripty ze souboru ~/.bashrc. Vykonávání tohoto skriptu lze zamezit parametrem --norc při spouštění Bashe. Parametrem --rcfile soubor pak donutíme Bash vykonat námi zvolený skript soubor místo standardního ~/.bashrc.

Některé verze Unixu obsahují speciálně upravené systémové skripty pro Bash, které schválně změní pořadí zmiňovaných skriptů tím, že spustí některé skripty dříve nebo nakombinují spouštění Bashe se startovacími skripty z jiných shellů různými způsoby.

Přenositelnost

Shellové skripty napsané podle specifikací Bashe (bashisms) nebudou spolehlivě fungovat na systému, který využívá Bourne shell nebo nějakou z jeho náhražek, pokud nebude na takovém systému nainstalován také Bash a daný skript nebude na začátku obsahovat speciální příkaz (shebang) obsahující #!/bin/bash místo standardního #!/bin/sh (viz FHS).

Klávesové zkratky

Následující seznam klávesových zkratek funguje pouze při použití implicitního mapování kláves (Emacs). Alternativní Vi-mapování zle zavést příkazem set -o vi.

: Automatické doplnění od pozice kurzoru.
+ 
: Přesun kurzoru na začátek řádku (stejně jako 

).

+ 
: Přesun kurzoru na konec řádku (stejně jako 

).

+ 
: Napíše předchozí příkaz (stejně jako 

).

+ 
: Napíše následující příkaz (stejně jako 

).

+ 
: Napíše dříve použitý příkaz obsahující zadaný výraz. Opakované stisknutí vyhledá další příkaz obsahující požadovaný výraz.
+ 
: Napíše nejnovější příkaz odpovidající předchozímu vyhlednávání (vyvarujte se pouzití v terminálu, jelikož tato zkratka také spouští jehe XOFF). Pokud změníte nastavení XOFF, použijte 
+ 
pro návrat.
+ 
: Vykoná nalezený příkaz.
+ 
: Vymaže obsah obrazovky (stejně jako příkaz clear).
+ 
: Vymaže obsah řádku před kurzorem a zkopíruje jej do schránky.
+ 
: Vymaže obsah řádku za kurzorem a zkopíruje jej do schránky.
+ 
: Vymaže slovo před kurzorem a zkopíruje jej do schránky.
+ 
: Vloží obsah schránky na pozici kurzoru.
+ 
: Odešle příznak EOF (End Of File), který (pokud není tato funkce vypnuta v nastavení) zavře právě aktivní shell (stejně jako příkaz exit). (Pouze pokud je na řádku s kurzorem nějaký text.)
+ 
: Odešle signál SIGINT právě probíhající úloze, který způsobí její přerušení a zavření.
+ 
: Odešle signál SIGTSTP právě probíhající úloze, který úlohu pozastaví. Pro pokračování úlohy zadejte příkaz fg ['jméno nebo id procesu'].
+ 

+ 
: Přemístí kurzor na jeho předchozí pozici. Lze tak efektivně přeskakovat mezi dvěma kusy kódu.
+ 

+ 
: Zapne editaci zvoleného řádku pomocí editoru definovaného v $EDITOR nebo v vi editoru, pokud není nastaven.
+ 
: Posune kurzor o jedno slovo dopředu.
+ 
: Posune kurzor o jedno slovo dozadu.
+ 
: Vymaže slovo před kurzorem.
+ 
: Vymaže slovo za kurzorem.
+ 
: Přepíše velkými písmeny všechny znaky od pozice kurzoru do konce slova.
+ 
: Přepíše malými písmeny všechny znaky od pozice kurzoru do konce slova.
+ 
: Přepíše znak pod kurzorem velkým písmenem a posune ho na konec daného slova.
+ 
: Zruší poslední editaci řádku.

Externí odkazy


     Projekt GNU
Organizace

GNU ManifestFree Software Foundation

Licence

GNU General Public LicenseGNU Lesser General Public LicenseAffero General Public LicenseGNU Free Documentation LicenseGPL linking exception

Software

GNUHurdGNOMEGnuzillaIceCatGnashBashGCCEmacsGNU C LibraryCoreutilsGNU build systemgettext

Stoupenci

Federico HeinzRichard Stallman