Bash (Unix -kuori) - Bash (Unix shell)

Lyödä
Gnu-bash-logo.svg
Bash kuvakaappaus.png
Kuvakaappaus Bash -istunnosta
Alkuperäinen kirjoittaja Brian Fox
Ensimmäinen julkaisu 8. kesäkuuta 1989 ; 32 vuotta sitten ( 1989-06-08 )
Vakaa julkaisu
5.1  Muokkaa tätä Wikidatassa / 6. joulukuuta 2020 ; 10 kuukautta sitten ( 6. joulukuuta 2020 )
Esikatsele julkaisua
5.1.8  Muokkaa tätä Wikidatassa / 4. toukokuuta 2021 ; 5 kuukautta sitten ( 4. toukokuuta 2021 )
Varasto
Kirjoitettu sisään C
Käyttöjärjestelmä
Alusta GNU
Saatavilla Monikielinen ( gettext )
Tyyppi Unix -kuori , komentokieli
Lisenssi Vuodesta 4.0: GPL-3.0 tai uudempi
1.11? 3.2: GPL-2.0 tai myöhemmin
0,99? 1.05 ?: GPL-1.0-tai uudempi
Verkkosivusto www .gnu .org /software /bash /

Bash on Unix shell ja komentokieli kirjoittanut Brian Fox varten GNU-projektia kuin ilmainen ohjelmisto korvaa Bourne shell . Ensimmäinen julkaistiin vuonna 1989, se on käytetty oletuksena kirjautuminen kuori useimmille Linux- jakeluissa. Versio on saatavana myös Windows 10: lle Windows -alijärjestelmän kautta Linuxille . Se on myös oletuskäyttäjäkuori Solaris 11: ssä. Bash oli myös oletuskuori kaikissa Apple macOS -versioissa ennen macOS Catalinan vuoden 2019 julkaisua , joka muutti oletuskuoren zsh: ksi , vaikka Bash on tällä hetkellä käytettävissä vaihtoehtoisena kuorina.

Bash on komentoprosessori, joka yleensä suoritetaan teksti -ikkunassa, jossa käyttäjä kirjoittaa toimintoja aiheuttavia komentoja. Bash voi myös lukea ja suorittaa komentoja tiedostosta, jota kutsutaan komentosarjaksi . Kuten useimmat Unix kuoret, se tukee tiedostonimi yleistyksen (Jokerihakua), putket , täällä asiakirjoja , komento korvaaminen , muuttujat , ja valvontarakenteet varten kunnon testaukseen ja iterointia . Avainsanat , syntaksin , dynaamisesti scoped muuttujia ja muita peruspiirteitä kielen kaikki kopioitu sh . Muut ominaisuudet, esim. Historia , kopioidaan csh- ja ksh -tiedostoista . Bash on POSIX -yhteensopiva kuori, mutta sillä on useita laajennuksia.

Kuori nimi on lyhenne sanoista Bourne Again Shell , joka on sanaleikki siitä nimi Bourne shell , että se korvaa ja ajatuksena " uudestisyntyneitä ".

Tietoturva-aukko on Bash vuodelta versioon 1.03 (elokuu 1989), puhuttu Shellshock , havaittiin syyskuun alussa 2014 ja nopeasti johti erilaisia hyökkäyksiä kautta Internetissä . Virheitä korjaavia korjaustiedostoja julkaistiin pian virheiden tunnistamisen jälkeen.

Historia

Brian Fox aloitti Bashin koodaamisen 10. tammikuuta 1988 sen jälkeen, kun Richard Stallman oli tyytymätön edellisen kehittäjän edistymisen puutteeseen. Stallman ja Free Software Foundation (FSF) pitivät ilmaista kuoria, joka voisi ajaa olemassa olevia komentosarjoja niin strategisesti täysin ilmaiseksi järjestelmäksi, joka on rakennettu BSD- ja GNU -koodista, että tämä oli yksi harvoista hankkeista, joita he rahoittivat itse. FSF: n työntekijä. Fox julkaisi Bashin beetaversiona .99 8. kesäkuuta 1989, ja pysyi ensisijaisena ylläpitäjänä aina vuoden 1992 puolivälin ja vuoden 1994 puolivälin välisenä aikana, jolloin hänet erotettiin FSF: stä ja hänen vastuunsa siirrettiin toiselle varhaiselle avustajalle, Chet Ramey.

Siitä lähtien Bashista on tullut ylivoimaisesti suosituin kuori Linuxin käyttäjien keskuudessa, ja siitä on tullut vuorovaikutteinen oletuskuori kyseisen käyttöjärjestelmän eri jakeluissa (vaikka Almquist -kuori voi olla oletuskomentosarja) ja Applen MacOS -julkaisuissa ennen Catalinaa lokakuussa 2019. bash on myös monille Microsoft Windowsin ja jaellaan Cygwin ja MinGW , jotta DOS jonka DJGPP hanke, että Novell NetWare , jotta OpenVMS jonka GNV hanke, jotta ArcaOS ja Android erilaisilla päätetilassa sovelluksia.

Syyskuussa 2014 Unix/Linux -asiantuntija Stéphane Chazelas löysi ohjelmasta tietoturvavian . Vika, ensin julkaisussa 24. syyskuuta, nimettiin Shellshock ja annetaan numerot CVE - 2014-6271 , CVE- 2014-6277 ja CVE- 2014-7169 . Virhettä pidettiin vakavana, koska Bashia käyttävät CGI -komentosarjat voivat olla haavoittuvia, mikä mahdollistaa mielivaltaisen koodin suorittamisen . Vika liittyi siihen, miten Bash välittää toimintojen määritelmät alikuorille ympäristömuuttujien kautta .

ominaisuudet

Bash komento syntaksi on pääjoukko Bourne shell-komennon syntaksi. Bash tukee hammasraudan laajennusta , komentorivin viimeistelyä (ohjelmoitava viimeistely ), perusvirheenkorjausta ja signaalin käsittelyä (käyttäen trap) bash 2.05a: n jälkeen. Bash voi suorittaa valtaosan Bourne -komentosarjoista ilman muutoksia alkaen Korn shell (ksh) ja C-kuori (csh), kuten komentorivimuokkaus, komento historia ( historykomento), hakemisto stapel $RANDOMja $PPIDmuuttujat, ja POSIX komento korvaaminen syntaksi $(…).

Kun käyttäjä painaa sarkainnäppäintä interaktiivisessa komentosarjassa, Bash käyttää automaattisesti komentorivin viimeistelyä , koska beta-versio 2.04, vastaamaan osittain kirjoitettuja ohjelmien nimiä, tiedostonimiä ja muuttujien nimiä. Bash-komentorivijärjestelmä on erittäin joustava ja muokattavissa, ja siihen on usein liitetty toimintoja, jotka täydentävät argumentteja ja tiedostonimiä tietyille ohjelmille ja tehtäville.

Bashin syntaksissa on monia laajennuksia, jotka puuttuvat Bourne -kuoresta. Bash voi suorittaa kokonaislukulaskelmia ("aritmeettinen arviointi") ilman kutevia ulkoisia prosesseja. Se käyttää ((…))komentoa ja $((…))muuttujan syntaksia tähän tarkoitukseen. Sen syntaksi yksinkertaistaa I/O -uudelleenohjausta . Se voi esimerkiksi ohjata vakiolähdön (stdout) ja standardivirheen (stderr) samanaikaisesti &>operaattorin avulla. Tämä on yksinkertaisempi kirjoittaa kuin Bourne -kuoren vastaava ' command > file 2>&1'. Bash tukee prosessin korvaamista käyttämällä <(command)ja >(command)syntaksia, joka korvaa komennon (tai syötteen) tuloksen, jossa tiedostonimeä yleensä käytetään. (Tämä toteutetaan /proc/fd/ unnamed -putkien kautta järjestelmissä, jotka tukevat tätä, tai väliaikaisten nimettyjen putkien kautta tarvittaessa).

Kun käytetään funktio -avainsanaa, Bash -funktion ilmoitukset eivät ole yhteensopivia Bourne/Korn/POSIX -komentosarjojen kanssa (KornShellillä on sama ongelma käytettäessä toimintoa), mutta Bash hyväksyy saman funktion ilmoitussyntaksin kuin Bourne- ja Korn -kuoret, ja on POSIX-yhteensopiva. Näiden ja muiden erojen vuoksi Bash -komentosarjat ovat harvoin suoritettavissa Bourne- tai Korn -kuoritulkkien alla, ellei niitä ole tarkoituksella kirjoitettu tätä yhteensopivuutta silmällä pitäen, mikä on harvinaisempaa Linuxin yleistyessä. POSIX -tilassa Bash on kuitenkin POSIX -yhteensopivampi.

Bash tukee tässä asiakirjoja . Versiosta 2.05b lähtien Bash voi ohjata vakiotulon (stdin) "tässä merkkijonosta" <<<operaattorin avulla.

Bash 3.0 tukee prosessin sisäistä säännöllisen lausekkeen vastaavuutta käyttäen Perliä muistuttavaa syntaksia .

Helmikuussa 2009 Bash 4.0 esitteli tuen assosiatiivisille matriiseille . Assosiatiiviset array -indeksit ovat merkkijonoja samalla tavalla kuin AWK tai Tcl . Niitä voidaan käyttää moniulotteisten matriisien jäljittelemiseen. Bash 4 vaihtaa myös lisenssin GPL-3.0-versioon tai uudempaan ; Jotkut käyttäjät epäilevät tätä lisenssimuutosta, minkä vuoksi MacOS käyttää edelleen vanhempia versioita. Apple lopulta lopetti Bashin käytön käyttöjärjestelmissään, kun MacOS Catalina julkaistiin vuonna 2019.

Kiinnikkeiden laajennus

Brace -laajennus, jota kutsutaan myös vuorotteluksi, on C -kuorista kopioitu ominaisuus . Se luo joukon vaihtoehtoisia yhdistelmiä. Luotujen tulosten ei tarvitse olla tiedostoina. Jokaisen laajennetun merkkijonon tuloksia ei lajitella ja vasemmalta oikealle järjestys säilyy:

$ 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

Käyttäjien ei pitäisi käyttää aaltosulkeisia laajennuksia kannettavissa komentotiedostoissa, koska Bourne -kuori ei tuota samaa tulosta.

$ # 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

Kun aaltosulkeen laajennus yhdistetään jokerimerkkeihin, aaltosulkeita laajennetaan ensin ja sitten syntyvät yleismerkit korvataan normaalisti. Näin ollen luettelo nykyisessä hakemistossa olevista JPEG- ja PNG -kuvista voidaan saada käyttämällä:

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.

Vuorottelun lisäksi aaltosuljinlaajennusta voidaan käyttää kahden kokonaisluvun tai kaksoispisteillä erotettujen merkkien välissä. Uudemmissa Bash -versioissa kolmas kokonaisluku voi määrittää lisäyksen.

$ 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

Kun ahdin laajennus on yhdistetty vaihteleva laajeneminen muuttujan laajennus suoritetaan sen jälkeen, kun ahdin laajennus, joka joissakin tapauksissa voi olla tarpeen käyttää, että evalsisäänrakennettu, näin:

$ 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

Käynnistysskriptit

Kun Bash käynnistyy, se suorittaa komennot erilaisissa pistetiedostoissa . Toisin Bash komentoriviskriptejä, piste tiedostot eivät yleensä suoritusoikeudet käytössä eikä tulkki direktiivin kaltainen #!/bin/bash.

Vanha yhteensopiva Bash-käynnistysesimerkki

Luuranko ~/.bash_profileAlla on yhteensopiva Bourne shell ja antaa semantiikka samanlainen csh varten ~/.bashrcja ~/.bash_login. Tämä on oikosulkuarviointi, joka testaa, onko tiedostonimi olemassa ja luettavissa, ohittaen osan sen jälkeen, jos sitä ei ole. [ -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

Käyttöjärjestelmän ongelmat Bashin käynnistyksessä

Jotkin Unix- ja Linux -versiot sisältävät Bash -järjestelmän käynnistysskriptejä, yleensä /etchakemistojen alla. Bash kutsuu näitä osana vakiokäynnistystä, mutta muut käynnistystiedostot voivat lukea ne eri järjestyksessä kuin dokumentoitu Bash -käynnistysjärjestys. Pääkäyttäjän tiedostojen oletussisällössä voi myös olla ongelmia, samoin kuin luontotiedostoissa, jotka järjestelmä tarjoaa uusille käyttäjätileille asennuksen yhteydessä. X-ikkunajärjestelmän käynnistävät käynnistysskriptit voivat myös tehdä yllättäviä asioita käyttäjän Bash-käynnistysskriptien kanssa yrittäessään määrittää käyttäjäympäristömuuttujia ennen ikkunanhallinnan käynnistämistä . Nämä ongelmat voidaan usein ratkaista käyttämällä a- ~/.xsessiontai ~/.xprofiletiedostoa lukemiseen ~/.profile- joka tarjoaa ympäristömuuttujat, joita ikkunanhallinnasta syntyneet Bash shell -ikkunat tarvitsevat, kuten xterm tai Gnome Terminal .

Siirrettävyys

Bashin käyttäminen --posixvaihtoehdolla tai set -o posixkomentosarjan esittäminen saa Bashin noudattamaan hyvin tarkasti POSIX 1003.2 -standardia . Siirrettävyyteen tarkoitettujen Bash -komentosarjojen tulee ottaa huomioon ainakin POSIX -kuoristandardi. Jotkut bash -ominaisuudet, joita ei löydy POSIXista, ovat:

  • Tietyt laajennetut kutsuvaihtoehdot
  • Kiinnikkeiden laajennus
  • Taulukot ja assosiatiiviset taulukot
  • Kaksoiskannatin [[ ... ]]laajennettu testirakenne ja sen säännöllinen lauseke
  • Kahden sulun aritmeettinen arviointirakenne (vain (( ... )); $(( ... ))on POSIX)
  • Tietyt merkkijonon käsittelytoiminnot parametrien laajennuksessa
  • local laajuuden muuttujille
  • Prosessin korvaaminen
  • Bash-erityiset sisäänrakennukset
  • Yhteisprosessit
  • $ EPOCHSECONDS ja $ EPOCHREALTIME -muuttujat

Jos koodikappale käyttää tällaista ominaisuutta, sitä kutsutaan "basismiksi" - ongelma kannettavassa käytössä. Debianin checkbashismsja Vidar Holenin shellcheckavulla voidaan varmistaa, että komentosarja ei sisällä näitä osia. Luetteloa vaihtelee todellinen tavoite kuori: Debianin käytännön sallii joidenkin laajennusten käsikirjoituksensa (koska ne ovat viiva kuori), kun taas käsikirjoitus aikoo tukea ennalta POSIX Bourne kuoret, kuten autoconf n configure, ovat vieläkin rajalliset ominaisuuksia, joita he voivat käyttää.

Pikanäppäimet

Bash tarjoaa lukurivin avulla pikanäppäimiä komentorivin muokkaamiseen käyttämällä oletusnäppäimiä ( Emacs ). Vi-siteet voidaan ottaa käyttöön suorittamalla set -o vi.

Prosessien hallinta

Bash -kuorella on kaksi komentojen suoritustilaa: erä ja samanaikainen tila.

Jos haluat suorittaa komentoja erässä (eli peräkkäin), ne on erotettava merkillä ";" tai erillisillä riveillä:

command1; command2

tässä esimerkissä komento1 suoritetaan, komento2 suoritetaan.

Tausta suoritus on Command1 voi tapahtua käyttämällä (Symboli) lopussa olevan suorittamiskäskyn, ja prosessi toteutetaan taustalla palaavat välittömästi ohjauksen kuoren ja mahdollistaa edelleen suorittaa käskyjä.

command1 &

Tai että kaksi komentoa 1 ja komentoa 2 voidaan suorittaa samanaikaisesti, ne on suoritettava Bash -kuorissa seuraavasti:

command1 & command2

Tässä tapauksessa komento1 suoritetaan taustalla ja symbolissa, jolloin ohjaus palautuu välittömästi komentoriville, joka suorittaa etualalla olevan komennon 2.

Prosessi voidaan pysäyttää ja ohjaus voidaan palauttaa bashiin kirjoittamalla Ctrl+, zkun prosessi on käynnissä etualalla.

Luettelo kaikista prosesseista, sekä taustalla että pysäytettynä, voidaan saavuttaa suorittamalla jobs:

$ jobs
[1]-  Running                  command1 &
[2]+  Stopped                  command2

Tuloksessa suluissa oleva numero viittaa työn tunnukseen. Plusmerkki tarkoittaa oletusprosessia kohteille bgja fg. Teksti "Käynnissä" ja "Pysäytetty" viittaavat prosessin tilaan . Viimeinen merkkijono on komento, joka aloitti prosessin.

Prosessin tilaa voidaan muuttaa käyttämällä erilaisia ​​komentoja. fgKomento tuo prosessi edustalle, kun bgsarjaa pysäytetyn prosessin käynnissä taustalla. bgja fgvoivat ottaa työn tunnuksen ensimmäisenä argumenttinaan määritelläkseen prosessin, jonka mukaan toimitaan. Ilman sitä he käyttävät oletusprosessia, joka tunnistetaan plusmerkillä jobs. killKomentoa voidaan käyttää prosessi lopetetaan ennenaikaisesti, lähettämällä sille signaalin . Työn tunnus on määritettävä prosenttiosuuden jälkeen:

kill %1

Ehdollinen toteutus

Bash toimittaa "ehdollisen suorituksen" komentoerottimet, jotka asettavat komennon suorittamisen riippuvaiseksi ennakkokomennon asettamasta poistumiskoodista . Esimerkiksi:

cd "$SOMEWHERE" && ./do_something || echo "An error occurred" >&2

Missä ./do_something suoritetaan vain, jos cd (muuta hakemistoa) -komento oli "onnistunut" (palautti poistumistilaksi nolla) ja echo -komento suoritettaisiin vain, jos joko cd- tai ./do_something -komento palauttaa "virheen" (ei-nolla-poistumistila).

Kaikkien komentojen poistumistila tallennetaan erikoismuuttujaan $?. Bash tukee ja muodostaa myös ehdollisen komentojen arvioinnin. if ...;then ...;else ...;ficase $VARIABLE in $pattern)...;;$other_pattern)...;; esac

Virheraportointi

Ulkoinen komento nimeltä bashbug ilmoittaa Bash -kuoren virheistä. Kun komentoa avataan, se tuo esiin käyttäjän oletuseditorin täytettävällä lomakkeella. Lomake postitetaan Bash -ylläpitäjille (tai vaihtoehtoisesti muihin sähköpostiosoitteisiin).

Ohjelmoitava suoritus

Ohjelmoitava Bash-täydennys completeja compgenkomennot ovat olleet saatavilla vuodesta 2.04 vuoden 2000 beetaversion jälkeen. Nämä toiminnot mahdollistavat monimutkaisen älykkään viimeistelyn, kuten tarjoamisen käytettävissä olevien ohjelmavaihtoehtojen välilehdelle saattamiseksi ja sen jälkeen, kun käyttäjä on valinnut vaihtoehdon, joka vaatii tiedostonimen seuraava tulo, vain automaattisesti täydentävät tiedostopolut (eivätkä muut vaihtoehdot) seuraavalle tunnukselle.

Julkaisuhistoria

Versio Julkaisupäivä Julkaisutiedot
bash-5.1 2020-12-07 github -versiohistoria UUTISET
bash-5.0 2019-01-07
bash-5.0-rc1 2018-12-20
bash-5.0-beta2 2018-11-28
bash-5.0-beta 2018-09-17
bash-5.0-alfa 22.5.2018
bash-4.4 15.9.2016 github -versiohistoria UUTISET v4.4
bash-4.4-rc2 22.8.2016
bash-4.4-rc1 24.02.2016
bash-4.4-beta2 6.7.2016
bash-4.4-beta 2015-10-12
bash-4.3 26.02.2014
bash-4.2 2011-02-13
bash-4.1 2009-12-31
bash-4.0 2009-02-20
bash-4.0-rc1 2009-01-12
bash-3.2 2006-10-11
bash-3.1 2005-12-08
bash-3.0 2004-08-03
bash-2.05b 2002-07-17
bash-2.05a 2001-11-16
bash-2.05 2001-04-09
bash-2.04 2000-03-21
bash-2.03 1999-02-19
bash-2.02 1998-04-18
bash-2.01 1997-06-05
bash-2.0 1996-12-31

Katso myös

Viitteet

Ulkoiset linkit