Articles

Bash (Unix shell)

Bash-komentosyntaksi on superjoukko Bourne shell-komentosyntaksista. Bash tukee ahdin laajennusta, komentorivin täydennystä (ohjelmoitavaa täydennystä), perusvianetsintää ja signaalinkäsittelyä (käyttäen trap) bash 2.05 a: n jälkeen muun muassa. Bash voi suorittaa suurimman osan Bourne shell skriptejä ilman muutoksia, lukuun ottamatta Bourne shell skriptejä kompastuminen fringe syntaksin käyttäytymistä tulkitaan eri tavalla Bash tai yrittää ajaa järjestelmän komento matching uudempi Bash builtin, jne. Bash-komentosyntaksi sisältää kornshellista (ksh) ja C-komentotulkilta (csh) piirrettyjä ideoita, kuten komentorivin muokkaus, komentohistoria (history komento), hakemistopino, $RANDOM ja $PPID muuttujat, ja POSIX-komentosovituksen syntaksi $(…).

kun käyttäjä painaa tab-näppäintä interaktiivisen komentotulkin sisällä, bash käyttää automaattisesti komentorivin täydennystä beta-versiosta 2.04 lähtien sovittaakseen osittain kirjoitetut ohjelmanimet, tiedostonimet ja muuttujan nimet. Bash-komentorivin täydennysjärjestelmä on hyvin joustava ja muokattavissa, ja siihen on usein pakattu toimintoja, jotka täydentävät argumentteja ja tiedostonimiä tietyille ohjelmille ja tehtäville.

Bashin syntaksissa on monia laajennuksia, jotka puuttuvat Bourne-komentotulkista. Bash voi suorittaa kokonaislukulaskelmia (”aritmeettinen arviointi”) ilman kutevia ulkoisia prosesseja. Se käyttää tähän tarkoitukseen ((…)) – komentoa ja $((…)) muuttuva syntaksi. Sen syntaksi yksinkertaistaa I / O uudelleenohjausta. Se voi esimerkiksi ohjata standardilähtöä (stdout) ja keskivirhettä (stderr) samanaikaisesti käyttäen &> operaattori. Tämä on yksinkertaisempaa kirjoittaa kuin Bourne shell-vastaava”command > file 2>&1”. Bash tukee prosessin korvaamista käyttämällä <(command) ja >(command)syntaksia, joka korvaa komennon lähdön (tai syötön), jossa tavallisesti käytetään tiedostonimeä. (Tämä toteutetaan/proc/ fd / nimeämättömillä putkilla järjestelmissä, jotka tukevat tätä, tai tarvittaessa tilapäisillä nimetyillä putkilla).

käytettäessä ”funktio” -avainsanaa Bash-funktioilmoitukset eivät ole yhteensopivia Bourne/Korn / POSIX-skriptien kanssa (Kornshellissa on sama ongelma käytettäessä ”funktiota”), mutta Bash hyväksyy saman funktioilmoituksen syntaksin kuin Bourne-ja Korn-kuoret ja on POSIX-konformantti. Näiden ja muiden erojen vuoksi Bash shell-skriptejä käytetään harvoin Bourne-tai Korn-komentotulkkien alla, ellei niitä ole tarkoituksella kirjoitettu tätä yhteensopivuutta silmällä pitäen, mikä on yhä harvinaisempaa Linuxin yleistyessä. Mutta POSIX-tilassa Bash vastaa POSIXia tarkemmin.

Bash tukee here-dokumentteja. Versiosta 2.05 b lähtien Bash voi ohjata standarditulon (stdin) ”here stringistä” käyttäen <<< – operaattoria.

Bash 3.0 tukee prosessin aikaista säännöllisen lausekkeen sovittamista käyttäen Perliä muistuttavaa syntaksia.

helmikuussa 2009 bash 4.0 otti käyttöön tuen assosiatiivisille ryhmille. Assosiatiiviset array-indeksit ovat merkkijonoja samaan tapaan kuin AWK tai Tcl. Niiden avulla voidaan jäljitellä moniulotteisia ryhmiä. Bash 4 vaihtaa lisenssinsä myös GPLv3: een; jotkut käyttäjät epäilevät tämän lisensointimuutoksen vuoksi MacOS käyttää edelleen vanhempia versioita. Apple lopetti lopulta Bashin käytön käyttöjärjestelmissään MacOS Catalinan julkaisun myötä vuonna 2019.

ahdin laajeneminen

ahdin laajeneminen, jota kutsutaan myös alternaatioksi, on C-kuoresta kopioitu ominaisuus. Se luo joukon vaihtoehtoisia yhdistelmiä. Tuotettuja tuloksia ei tarvitse olla tiedostoina. Jokaisen laajennetun merkkijonon tuloksia ei järjestetä ja vasemmalta oikealle järjestys säilyy:

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

käyttäjien ei tulisi käyttää ahdinlaajennuksia kannettavissa komentotulkeissa, koska Bourne-komentotulkki ei tuota samaa tulostetta.

$ # 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 ahdinlaajennus yhdistetään yleismerkkeihin, laajennetaan ensin henkselit, minkä jälkeen syntyvät yleismerkit korvataan normaalisti. Näin ollen JPEG – ja PNG-kuvien luettelo nykyisessä hakemistossa voitaisiin saada käyttämällä:

ls *.{jpg,jpeg,png} # expands to *.jpg *.jpeg *.png - after which, # the wildcards are processedecho *.{png,jp{e,}g} # echo just show the expansions - # and braces in braces are possible.

alternaation lisäksi ahdinlaajennusta voidaan käyttää kahden kokonaisluvun välisille peräkkäisille vaihteluväleille tai merkeille, jotka on erotettu kaksoispisteillä. Bashin uudemmat versiot antavat kolmannen kokonaisluvun määritellä lisäyksen.

$ echo {1..10}1 2 3 4 5 6 7 8 9 10$ echo file{1..4}.txtfile1.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 ahdinlaajennus yhdistetään muuttuvaan laajennukseen, suoritetaan aaltolaajennus ahdinlaajennuksen jälkeen, mikä voi joissakin tapauksissa edellyttää eval sisää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 evaluated1 2 3 4 5 6 7 8 9 10

Startup scriptsEdit

tämä osio sisältää ohjeita, neuvoja tai ohjeita sisältöön. Wikipedian tarkoitus on esittää faktoja, ei kouluttaa. Auta parantamaan tätä artikkelia joko kirjoittamalla uudelleen kuinka-sisältöön tai siirtämällä se Wikiversity, Wikikirjoja tai Wikivoyage. (Tammikuu 2019)

Bashin käynnistyessä se suorittaa komennot erilaisissa pistetiedostoissa. Toisin kuin Bash-komentotulkin skripteissä, pistetiedostoissa ei tyypillisesti ole suoritusoikeuksia käytössä eikä tulkkidirektiiviä, kuten #!/bin/bash.

Legacy-yhteensopiva Bash startup exampleEdit

luuranko ~/.bash_profile alla on yhteensopiva Bourne-komentotulkin kanssa ja antaa csh: n kaltaisen semantiikan ~/.bashrc ja ~/.bash_login && cmd on oikosulkuarviointi, jossa testataan, onko tiedostonimi olemassa ja onko se luettavissa, ohitetaan osa && jos se ei ole.

 && . ~/.profile # set up environment, once, Bourne-sh syntax onlyif ; then # are we interactive? && . ~/.bashrc # tty/prompt/function setup for interactive shells && . ~/.bash_login # any at-login tasks for login shell onlyfi # End of "if" block

Käyttöjärjestelmäongelmat Bash-startupEdit

jotkut Unixin ja Linuxin versiot sisältävät Bash-järjestelmän käynnistyskomentosarjoja, yleensä /etc hakemistoja. Bash kutsuu näitä osana normaalia alustustaan, 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 luurankotiedostoissa, joita järjestelmä tarjoaa uusille käyttäjätileille asennuksen yhteydessä. X-ikkunajärjestelmän käynnistävät käynnistyskomentosarjat saattavat myös tehdä yllättäviä asioita käyttäjän Bash-käynnistyskomentosarjoilla yrittäessään määrittää käyttäjä-ympäristömuuttujia ennen ikkunanhallinnan käynnistämistä. Näitä kysymyksiä voidaan usein käsitellä käyttämällä ~/.xsession tai ~/.xprofile — tiedostoa, jolla voidaan lukea ~/.profile – joka tarjoaa ikkunanhallinnan tarvitsemat ympäristömuuttujat, kuten xterm tai Gnome-pääte.

PortabilityEdit

Bashin kutsuminen --posix – valinnalla tai set -o posix skriptissä saa Bashin mukautumaan hyvin tarkasti POSIX 1003.2-standardiin. Siirrettävyyteen tarkoitetuissa bash shell-skripteissä tulisi ottaa huomioon ainakin POSIX shell-standardi. Jotkut bash ominaisuuksia ei löydy POSIX ovat:

  • tietyt laajennetut kutsumusvaihtoehdot
  • ahdin laajeneminen
  • Matriisit ja assosiatiiviset ryhmät
  • kaksilohko ] extended test construct and its regex matching
  • the double-sulut aritmeettinen-evaluation construct (vain (... )) ; $(( ... )) is POSIX)
  • tietyt merkkijonomanipulaatio-operaatiot parametrilaajennuksessa
  • paikalliset scopatuille muuttujille
  • Prosessisubstituutiot
  • Koprosessit
  • $EPOCHSECONDS and $EPOCHREALTIME variabilities

jos koodinpätkä käyttää tällaista ominaisuutta, sitä kutsutaan ”bashismiksi”-kannettavaan käyttöön liittyväksi ongelmaksi. Debianin checkbashisms ja Vidar Holenin shellcheck voidaan varmistaa, ettei skripti sisällä näitä osia. Lista vaihtelee riippuen varsinaisesta kohdekuoresta: Debianin käytäntö sallii joitain laajennuksia skripteissä (koska ne ovat dash), kun taas skripti, joka aikoo tukea ennen POSIX-Bourne-kuoria, kuten autoconf: n configure, on vielä rajallisempi ominaisuuksiltaan.

näppäimistön shortcutsEdit

pääartikkeli: GNU Readline

bash käyttää readlinea antamaan pikanäppäimiä komentorivin muokkaukseen käyttäen oletusnäppäimistöjä (Emacs). Vi-sidokset voi ottaa käyttöön ajamalla set -o vi.

Prosessinhallintamedit

Bash-komentotulkilla on komennoille kaksi suoritustapaa: batch ja samanaikaistila.

komentojen suorittamiseksi erissä (eli järjestyksessä) ne on erotettava merkillä”;”, tai erillisillä riveillä:

command1; command2

tässä esimerkissä komennon 1 päätyttyä suoritetaan komento 2.

komento1: n taustatoteutus voi tapahtua käyttäen (symboli &) suorituskomento-komennon lopussa, ja prosessi suoritetaan siten, että taustalla palautetaan ohjaus välittömästi komentotulkkiin ja mahdollistetaan komentojen jatkuva suorittaminen.

command1 &

tai jotta kaksi komentoa voidaan suorittaa samanaikaisesti, ne on suoritettava Bash-komentotulkilla seuraavalla tavalla:

command1 & command2

tässä tapauksessa command1 suoritetaan taustalla & symboli, palauttaen välittömästi hallinnan komentotulkille, joka suorittaa komennon2 etualalla.

prosessi voidaan pysäyttää ja ohjaus palauttaa bashille kirjoittamalla Ctrl+z prosessin ollessa käynnissä etualalla.

luettelo kaikista prosesseista, sekä taustalla että pysäytettyinä, voidaan saavuttaa ajamalla jobs:

$ jobs- Running command1 &+ Stopped command2

ulostulossa, suluissa oleva numero viittaa työtunnukseen. Plusmerkki merkitsee oletusprosessia bg ja fg. Teksti ”käynnissä” ja ”pysäytetty” viittaavat prosessin tilaan. Viimeinen merkkijono on komento, joka aloitti prosessin.

prosessin tilaa voidaan muuttaa erilaisilla komennoilla. fg komento tuo etualalle prosessin, kun taas bg asettaa taustalla käynnissä olevan pysäytetyn prosessin. bg ja fg voivat ottaa ensimmäiseksi argumentikseen työtunnuksen, jolla voi määritellä, millä prosessilla toimitaan. Ilman yhtä ne käyttävät oletusprosessia, joka tunnistetaan plus-merkillä tulosteessa jobskill komentoa voidaan käyttää prosessin päättämiseen ennenaikaisesti lähettämällä sille signaali. Tehtävätunnus on määriteltävä prosenttimerkin jälkeen:

kill %1

ehdollinen suoritusedit

Bash toimittaa ”ehdollisen suorituksen” komennon erotinyksiköt, jotka tekevät komennon suorituksen ehdolliseksi ennakkokäskyn asettaman poistumiskoodin perusteella. Esimerkiksi:

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

missä ./do_something suoritetaan vain, jos CD (change directory) – komento ”onnistui” (palautti poistumistilan nollaksi) ja echo-komento suoritetaan vain, jos joko cd tai the ./ do_something komento return an ”error” (non-zero exit status).

kaikkien komentojen poistumistila tallennetaan erikoismuuttujaan $?. Bash tukee myös if ...;sitten ...;muuten ...; fi ja case $VARIABLE in $pattern)...;; $other_pattern)...;; esac forms of conditional command evaluation.

Vikailmoitusmedit

”bashbug” ohjaa tänne. Laajalti raportoitu syyskuun 2014 vika löytyy Bash, katso Shellshock (ohjelmisto bug).

ulkoinen komento nimeltä bashbug raportoi Bash-komentotulkin bugeja. Kun komento kutsutaan, se tuo esiin käyttäjän oletusmuokkaimen täytettävällä lomakkeella. Lomake postitetaan Bash ylläpitäjille (tai vaihtoehtoisesti muihin sähköpostiosoitteisiin).

Ohjelmoitavat täydennykset

Bash ohjelmoitavat täydennykset, complete ja compgen komennot ovat olleet saatavilla 2.04 vuonna 2000. Nämä toiminnot mahdollistavat monimutkaisen älykkään täydennyksen, kuten tarjoten välilehdelle käytettävissä olevia ohjelmavaihtoehtoja ja sen jälkeen, kun käyttäjä valitsee vaihtoehdon, joka vaatii tiedostonimen sen seuraavaksi syötöksi, vain seuraavan Tokenin tiedostopolkujen (eikä muiden vaihtoehtojen) automaattisen täytön.