Bash (Unix shell) - Bash (Unix shell)
|
Snímek obrazovky relace Bash
| |
| Původní autoři | Brian Fox |
|---|---|
| První vydání | 8. června 1989 |
| Stabilní uvolnění | |
| Náhled vydání | |
| Úložiště | |
| Napsáno | C |
| Operační systém | |
| Plošina | GNU |
| K dispozici v | Vícejazyčný ( gettext ) |
| Typ | Unix shell , příkazový jazyk |
| Licence | Od 4.0: GPL-3.0 nebo novější 1.11? až 3,2: GPL-2.0 nebo novější 0,99? na 1.05?: GPL-1.0 nebo novější |
| webová stránka | www |
Bash je shell Unix a příkazový jazyk napsaný Brianem Foxem pro projekt GNU jako bezplatná náhrada softwaru za shell Bourne . Poprvé vydán v roce 1989, byl použit jako výchozí přihlašovací shell pro většinu distribucí Linuxu . Verze je také k dispozici pro Windows 10 prostřednictvím subsystému Windows pro Linux . Je to také výchozí uživatelský shell v Solarisu 11. Bash byl také výchozí shell ve všech verzích Apple macOS před vydáním macOS Catalina pro rok 2019 , které změnilo výchozí shell na zsh , ačkoli Bash v současné době zůstává k dispozici jako alternativní shell.
Bash je příkazový procesor, který obvykle běží v textovém okně, kde uživatel zadává příkazy, které způsobují akce. Bash může také číst a spouštět příkazy ze souboru, který se nazývá shell skript . Jako většina unixových shellů podporuje globbing názvů souborů (shoda zástupných znaků), piping , zde dokumenty , nahrazování příkazů , proměnné a řídicí struktury pro testování podmínek a iteraci . Mezi klíčová slova , syntax , dynamicky rozsahem proměnné a další základní rysy jazyka jsou zkopírovány z sh . Další funkce, např. Historie , jsou kopírovány z csh a ksh . Bash je shell kompatibilní s POSIX , ale s řadou rozšíření.
Název skořápky je zkratka pro Bourne Again Shell , slovní hříčka ve jménu Bourneovy skořápky , kterou nahrazuje, a pojem „ znovuzrození “.
Bezpečnostní díra v Bash pocházející z verze 1.03 (srpen 1989), přezdívaný Shellshock , byl objeven na počátku září 2014 a rychle vedl k řadě útoků přes internet . Záplaty k opravě chyb byly k dispozici brzy poté, co byly chyby identifikovány.
Dějiny
Brian Fox začal kódovat Bash 10. ledna 1988 poté, co Richard Stallman začal být nespokojený s nedostatkem pokroku, kterého dosáhl předchozí vývojář. Stallman a Free Software Foundation (FSF) považovali bezplatný shell, který by mohl spouštět existující skripty shellu za tak strategické pro zcela bezplatný systém postavený z kódu BSD a GNU, že to byl jeden z mála projektů, které si sami financovali, přičemž společnost Fox vykonávala práci jako zaměstnanec FSF. Fox vydal Bash jako beta verzi .99, 8. června 1989, a zůstal primárním správcem až do doby mezi polovinou roku 1992 a polovinou roku 1994, kdy byl propuštěn z FSF a jeho odpovědnost byla převedena na jiného raného přispěvatele, Chet Ramey.
Od té doby se Bash stal zdaleka nejpopulárnějším shellem mezi uživateli Linuxu a stal se výchozím interaktivním shellem v různých distribucích tohoto operačního systému (ačkoli Almquist shell může být výchozím skriptovacím shellem) a ve vydáních macOS Apple před Catalinou v říjnu 2019. Bash byl také portován na Microsoft Windows a distribuován s Cygwin a MinGW , aby DOS pomocí DJGPP projektu, Novell NetWare , na OpenVMS projektem GNV, aby ArcaOS a Android prostřednictvím různých koncových aplikací emulace.
V září 2014 Stéphane Chazelas, specialista na Unix/Linux, objevil v programu bezpečnostní chybu . Chyba, poprvé popsán dne 24. září, byl jmenován Shellshock a přiřazena čísla CVE - 2.014 - 6.271 , CVE- 2014-6277 a CVE- 2014 do 7169 . Chyba byla považována za závažnou, protože skripty CGI používající Bash mohou být zranitelné, což umožňuje spuštění libovolného kódu . Tato chyba souvisela s tím, jak Bash předává definice funkcí do subshellů prostřednictvím proměnných prostředí .
Funkce
Syntaxe příkazu Bash je nadmnožinou syntaxe příkazu Bourne shell. Bash mimo jiné podporuje rozšíření rovnátka , dokončení příkazového řádku (programovatelné dokončení), základní ladění a zpracování signálu (pomocí trap) od bash 2.05a. Bash může spouštět drtivou většinu skriptů shellu Bourne bez úprav, s výjimkou skriptů Bourne shell, které narazí na okrajové chování syntaxe interpretované odlišně v Bash nebo se pokusí spustit systémový příkaz odpovídající novějšímu vestavěnému Bash atd. Syntaxe příkazu Bash obsahuje nakreslené nápady z Korn shell (ksh) a C shell (csh), jako je střih příkazového řádku, historie příkaz ( historypříkaz), zásobníku adresářů, v $RANDOMa $PPIDproměnných a POSIX příkaz substituční syntaxi $(…).
Když uživatel stiskne klávesu tab v interaktivním příkazovém prostředí, Bash automaticky použije dokončení příkazového řádku od verze beta 2.04, aby odpovídal částečně zadaným názvům programů, názvům souborů a názvům proměnných. Systém dokončení příkazového řádku Bash je velmi flexibilní a přizpůsobitelný a často je vybaven funkcemi, které doplňují argumenty a názvy souborů pro konkrétní programy a úkoly.
Bashova syntaxe má v Bourneově shellu mnoho rozšíření, která chybí. Bash může provádět celočíselné výpočty („aritmetické hodnocení“), aniž by docházelo k vytváření externích procesů. K tomuto účelu používá ((…))příkaz a $((…))syntaxi proměnných. Jeho syntax zjednodušuje přesměrování I/O . Pomocí operátoru může například přesměrovat současně standardní výstup (stdout) a standardní chybu (stderr) &>. Je to jednodušší na psaní než ekvivalent Bourneova shellu ' command > file 2>&1'. Bash podporuje nahrazování procesů pomocí syntaxe <(command)a >(command), která nahrazuje výstup (nebo vstup) příkazu, kde se běžně používá název souboru. (Toto je implementováno prostřednictvím /proc/fd/ nejmenovaných kanálů v systémech, které to podporují, nebo případně pomocí dočasných pojmenovaných kanálů ).
Při použití klíčového slova 'funkce' nejsou deklarace funkcí Bash kompatibilní se skripty Bourne/Korn/POSIX (KornShell má stejný problém při použití 'funkce'), ale Bash přijímá stejnou syntaxi deklarace funkcí jako skořápky Bourne a Korn, a je kompatibilní s POSIX. Kvůli těmto a dalším rozdílům jsou skripty prostředí Bash zřídka spustitelné pod překladači prostředí Bourne nebo Korn, pokud nejsou záměrně napsány s ohledem na tuto kompatibilitu, což se stává stále běžnějším, protože Linux je stále rozšířenější. Ale v režimu POSIX Bash vyhovuje POSIXu těsněji.
Bash zde podporuje dokumenty . Od verze 2.05b může Bash přesměrovat standardní vstup (stdin) z řetězce „zde“ pomocí <<<operátoru.
Bash 3.0 podporuje během procesu párování regulárních výrazů pomocí syntaxe připomínající Perl .
V únoru 2009 zavedl Bash 4.0 podporu asociativních polí . Asociativní indexy pole jsou řetězce, podobným způsobem jako AWK nebo Tcl . Lze je použít k emulaci vícerozměrných polí. Bash 4 také přepíná svou licenci na GPL-3.0 nebo novější ; někteří uživatelé mají podezření, že tato změna licencování je důvodem, proč MacOS nadále používá starší verze. Apple konečně přestal používat Bash ve svých operačních systémech s vydáním MacOS Catalina v roce 2019.
Rozšíření rovnátka
Brace expanze, také volal střídání, je funkce zkopírovány z C pláště . Generuje sadu alternativních kombinací. Generované výsledky nemusí existovat jako soubory. Výsledky každého rozbaleného řetězce nejsou seřazeny a je zachováno pořadí zleva doprava:
$ 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
Uživatelé by v přenosných shell skriptech neměli používat rozšíření rovnátek, protože shell Bourne nevytváří stejný výstup.
$ # A traditional shell does not produce the same output
$ /bin/sh -c 'echo a{p,c,d,b}e'
a{p,c,d,b}e
Když je rozšíření rovnátka kombinováno se zástupnými znaky, nejprve se rozšíří složené závorky a poté se normálně nahradí výsledné zástupné znaky. Seznam obrázků JPEG a PNG v aktuálním adresáři lze tedy získat pomocí:
ls *.{jpg,jpeg,png} # expands to *.jpg *.jpeg *.png - after which,
# the wildcards are processed
echo *.{png,jp{e,}g} # echo just show the expansions -
# and braces in braces are possible.
Kromě střídání lze rozšíření závorek použít pro sekvenční rozsahy mezi dvěma celými čísly nebo znaky oddělenými dvojitými tečkami. Novější verze Bash umožňují třetí celé číslo určit přírůstek.
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
$ echo file{1..4}.txt
file1.txt file2.txt file3.txt file4.txt
$ echo {a..e}
a b c d e
$ echo {1..10..3}
1 4 7 10
$ echo {a..j..3}
a d g j
Když je rozšíření rovnátka kombinováno s variabilním rozšířením, variabilní rozšíření se provede po rozšíření rovnátka, což v některých případech může vyžadovat použití evalvestavěného, tedy:
$ start=1; end=10
$ echo {$start..$end} # fails to expand due to the evaluation order
{1..10}
$ eval echo {$start..$end} # variable expansion occurs then resulting string is evaluated
1 2 3 4 5 6 7 8 9 10
Spouštěcí skripty
Když se Bash spustí, provede příkazy v různých bodových souborech . Na rozdíl od skriptů shellu Bash, dot soubory obvykle nemají oprávnění spouštět povolen ani směrnice interpreter podobně #!/bin/bash.
Starší kompatibilní příklad spuštění Bash
Níže uvedená kostra ~/.bash_profileje kompatibilní s pláštěm Bourne a poskytuje sémantiku podobnou csh pro ~/.bashrca ~/.bash_login. Jedná se o zkratové vyhodnocení, které testuje, zda název souboru existuje a je čitelné, přeskočí část za ním, pokud není.
[ -r filename ] && cmd&&
[ -r ~/.profile ] && . ~/.profile # set up environment, once, Bourne-sh syntax only
if [ -n "$PS1" ] ; then # are we interactive?
[ -r ~/.bashrc ] && . ~/.bashrc # tty/prompt/function setup for interactive shells
[ -r ~/.bash_login ] && . ~/.bash_login # any at-login tasks for login shell only
fi # End of "if" block
Problémy s operačním systémem při spuštění Bash
Některé verze Unixu a Linuxu obsahují skripty pro spuštění systému Bash, obvykle pod /etcadresáři. Bash je nazývá jako součást své standardní inicializace, ale jiné spouštěcí soubory je mohou číst v jiném pořadí než zdokumentovaná spouštěcí sekvence Bash. Problémy může mít také výchozí obsah souborů uživatele root, stejně jako kosterní soubory, které systém poskytuje novým uživatelským účtům po nastavení. Spouštěcí skripty, které spouští X okenní systém, mohou také dělat překvapivé věci se spouštěcími skripty uživatele Bash při pokusu o nastavení proměnných uživatelského prostředí před spuštěním správce oken . Tyto problémy lze často vyřešit pomocí souboru ~/.xsessionnebo ~/.xprofilepro čtení ~/.profile- což poskytuje proměnné prostředí, které okna prostředí Bash vytvořená ze správce oken potřebují, například xterm nebo Gnome Terminal .
Přenosnost
Vyvolání Bash pomocí této --posixmožnosti nebo uvedení set -o posixve skriptu způsobí, že se Bash velmi blíží standardu POSIX 1003.2 . Skripty prostředí Bash určené pro přenositelnost by měly zohledňovat alespoň standard prostředí POSIX. Některé funkce bash, které nebyly v POSIXu nalezeny, jsou:
- Některé rozšířené možnosti vyvolání
- Rozšíření rovnátka
- Pole a asociativní pole
[[ ... ]]Rozšířená testovací konstrukce s dvojitou závorkou a její shoda s regexem- Konstrukce aritmetického hodnocení s dvojitými závorkami (pouze
(( ... ));$(( ... ))je POSIX) - Určité operace manipulace s řetězci při rozšiřování parametrů
-
localpro proměnné s rozsahem - Substituce procesu
- Vestavby specifické pro bash
- Koprocesy
- Proměnné $ EPOCHSECONDS a $ EPOCHREALTIME
Pokud část kódu používá takovou funkci, nazývá se to „bashismus“ - problém přenosného použití. Pomocí Debianu checkbashismsa Vidaru Holena je shellcheckmožné zajistit, aby skript tyto části neobsahoval. Tento seznam se liší v závislosti na aktuálním cílovém shell: politika debianí umožňuje některá rozšíření ve svých skriptech (tak, jak jsou v přístrojové skořápce), zatímco skript má v úmyslu podporovat pre-POSIX Bourne Shell, stejně jako autoconf ‚s configure, jsou ještě více omezeny funkce, které mohou používat.
Klávesové zkratky
Bash používá readline k poskytování klávesových zkratek pro úpravy příkazového řádku pomocí výchozích vazeb kláves ( Emacs ). Vázání Vi lze povolit spuštěním set -o vi.
Řízení procesu
Bash shell má dva režimy provádění příkazů: dávkový a souběžný režim.
Chcete -li příkazy spouštět dávkově (tj. Postupně), musí být odděleny znakem „;“ nebo na samostatných řádcích:
command1; command2
v tomto případě se po dokončení příkazu command1 provede příkaz2.
K provedení příkazu1 na pozadí může dojít pomocí (symbol &) na konci příkazu k provedení a proces bude proveden na pozadí, čímž se okamžitě vrátí kontrola do shellu a umožní pokračování provádění příkazů.
command1 &
Nebo chcete -li provést souběžné spuštění dvou příkazů1 a 2, musí být spuštěny v prostředí Bash následujícím způsobem:
command1 & command2
V tomto případě je příkaz1 proveden na pozadí a symbolu, čímž se okamžitě vrátí kontrola do prostředí, které provádí příkaz2 v popředí.
Proces lze zastavit a vrátit řízení do bash zadáním Ctrl+, zzatímco proces běží v popředí.
Seznam všech procesů, na pozadí i zastavených, lze dosáhnout spuštěním jobs:
$ jobs
[1]- Running command1 &
[2]+ Stopped command2
Ve výstupu číslo v závorkách odkazuje na ID úlohy. Znaménko plus znamená výchozí postup pro bga fg. Text „Spuštěno“ a „Zastaveno“ odkazuje na stav procesu . Poslední řetězec je příkaz, který proces spustil.
Stav procesu lze změnit pomocí různých příkazů. fgPříkaz přináší proces do popředí, zatímco bgnastavuje zastavil proces běžící na pozadí. bga fgjako svůj první argument může vzít ID úlohy, aby určil postup, podle kterého se bude jednat. Bez jednoho používají výchozí proces označený znaménkem plus ve výstupu jobs. killPříkaz lze použít k ukončení procesu předčasně, odesláním to signál . ID úlohy musí být uvedeno za znakem procenta:
kill %1
Podmíněné provedení
Bash dodává oddělovače příkazů "podmíněné spuštění", které činí provádění příkazu závislé na kódu ukončení nastaveném předchozím příkazem. Například:
cd "$SOMEWHERE" && ./do_something || echo "An error occurred" >&2
Kde ./do_something je spuštěno pouze tehdy, pokud byl příkaz cd (změna adresáře) „úspěšný“ (vrátil stav ukončení nula) a příkaz echo by byl proveden pouze tehdy, pokud příkaz cd nebo ./do_something vrátí „chybu“ (nenulový stav výstupu).
U všech příkazů je stav ukončení uložen ve speciální proměnné $?. Bash také podporuje a formy podmíněného vyhodnocení příkazů.
if ...;then ...;else ...;ficase $VARIABLE in $pattern)...;;$other_pattern)...;; esac
Hlášení chyb
Externí příkaz s názvem bashbug hlásí chyby prostředí Bash. Když je příkaz vyvolán, vyvolá uživateli výchozí editor s formulářem, který je třeba vyplnit. Formulář je zaslán správcům Bash (nebo volitelně na jiné e -mailové adresy).
Programovatelné dokončení
Programovatelné dokončení Bash completea compgenpříkazy jsou k dispozici od beta verze 2.04 v roce 2000. Tato zařízení umožňují komplexní inteligentní dokončení, jako je například nabídka úplného vyplnění dostupných možností programu a poté, co uživatel vybere možnost, která jako svůj název vyžaduje název souboru další vstup, pouze automatické doplňování cest k souborům (a ne další možnosti) pro další token.
Historie vydání
| Verze | Datum vydání | Poznámky k vydání |
|---|---|---|
| bash-5.1 | 07. 2020 | historie verzí github NOVINKY |
| bash-5.0 | 2019-01-07 | |
| bash-5.0-rc1 | 2018-12-20 | |
| bash-5.0-beta2 | 2018-11-28 | |
| bash-5.0-beta | 17. 09. 2018 | |
| bash-5.0-alfa | 2018-05-22 | |
| bash-4.4 | 15. 9. 2016 | historie verzí github NOVINKY v4.4 |
| bash-4.4-rc2 | 2016-08-22 | |
| bash-4.4-rc1 | 24. února 2016 | |
| bash-4.4-beta2 | 11. července 2016 | |
| bash-4.4-beta | 12. 10. 2015 | |
| bash-4.3 | 26. 2014 | |
| bash-4.2 | 13. února 2011 | |
| bash-4.1 | 31. 12. 2009 | |
| bash-4.0 | 2009-02-20 | |
| bash-4.0-rc1 | 2009-01-12 | |
| bash-3.2 | 11. 10. 2006 | |
| bash-3.1 | 08. 12. 2005 | |
| bash-3.0 | 2004-08-03 | |
| bash-2,05b | 17. července 2002 | |
| bash-2,05a | 2001-11-16 | |
| bash-2,05 | 2001-04-09 | |
| bash-2.04 | 2000-03-21 | |
| bash-2.03 | 19. 2. 1999 | |
| bash-2.02 | 18. dubna 1998 | |
| bash-2.01 | 1997-06-05 | |
| bash-2.0 | 1996-12-31 |