GNU Bourne-Again Shell | |
---|---|
Tipikus munkamenet a bashban | |
Típusú | UNIX shell |
Szerző | Brian Fox |
Fejlesztő | Chet Ramey |
Beírva | Xi |
Operációs rendszer | UNIX-szerű |
Interfész nyelvek | angol , többnyelvű ( gettext ) |
Első kiadás | 1989. június 8 |
Hardver platform | x86_64 [2] és i686 [2] |
legújabb verzió |
|
béta verzió | 5.2-béta ( 2022. április 13. ) |
Olvasható fájlformátumok | Bash szkript [d] |
Engedély | GNU általános nyilvános licenc |
Weboldal | gnu.org/software/bash/ |
Médiafájlok a Wikimedia Commons oldalon |
A Bash (az angol B ourne a gain sh ell szóból , szó "Born again" shell - "reborn" shell) a Bourne shell parancshéj továbbfejlesztett és modernizált változata . Az egyik legnépszerűbb modern UNIX shell . Különösen népszerű Linux környezetben , ahol gyakran használják előre telepített parancshéjként.
Ez egy parancsfeldolgozó, amely általában interaktívan működik szöveges ablakban. A Bash parancsokat is tud olvasni egy script (vagy script ) nevű fájlból . Mint minden Unix shell, támogatja a fájlok és könyvtárak befejezését, a parancskimenetek helyettesítését, a változókat, a végrehajtási sorrend vezérlését, az elágazás és a ciklus utasításait. A kulcsszavakat, a szintaxist és a nyelv egyéb alapvető jellemzőit az sh -ből kölcsönözték . Más funkciók, például a történelem, a csh és a ksh fájlokból lettek másolva . A Bash alapvetően megfelel a POSIX szabványnak , de számos kiterjesztéssel [3] .
A "bash" név az angol nyelv rövidítése . Bourne-again-shell ("egy másik-Bourne-shell"), és játék a szavakkal: A Bourne-shell a UNIX (sh) shell egyik népszerű változata, szerzője Stephen Bourne ( 1978 ), 1987 -ben javítva. írta: Brian Fox . A Bourne vezetéknév (Born) az angol born szót visszhangozza , jelentése "született", innen: born-ain-command shell.
2014 szeptemberében egy széles körben kihasznált Bashdoor biztonsági rést fedeztek fel a bash -ban .
A fontos Bourne shell szkriptek túlnyomó többsége módosítás nélkül futtatható a bash-ban, kivéve azokat, amelyek Bourne speciális változókra hivatkoznak vagy Bourne beépített modulokat használnak. A Bash parancs szintaxisa a Korn parancsértelmezőből ( ksh ) és a C shellből ( csh ) kölcsönzött ötleteket tartalmaz , mint például a parancssori szerkesztés, a parancselőzmények, a könyvtárverem, a változók $RANDOMés $PPIDa parancshelyettesítő szintaxis $(…). Amikor interaktív shellként használják, a Bash támogatja a programnevek, fájlok, változók stb. automatikus kiegészítését a billentyű használatával Tab ↹.
A bash interpreter számos beépített parancsot tartalmaz, amelyek közül néhánynak hasonló futtatható fájljai vannak az operációs rendszerben . Ne feledje azonban, hogy a beépített parancsokhoz leggyakrabban nincsenek kézikönyvoldalak , és amikor megpróbálja megtekinteni egy beépített parancs súgóját, valójában a végrehajtható fájl súgója jelenik meg. A végrehajtható fájl és a beépített parancs paraméterei eltérhetnek. A beépített parancsokkal kapcsolatos információk a bash man oldalon találhatók:
man bash
Bemenet kimenet | |
---|---|
echo | kifejezést vagy egy változó tartalmát ( stdout ) ad ki, de használatában vannak korlátozások [4] |
printf | formázott kimeneti parancs, a parancs kiterjesztett verziójaecho |
read | "beolvassa" egy változó értékét a szabványos bemenetről ( stdin ), interaktívan ez a billentyűzet |
Fájlrendszer | |
cd | megváltoztatja az aktuális könyvtárat |
pwd | megjeleníti az aktuális munkakönyvtár nevét |
pushd | megfordítja az aktuális könyvtárat |
popd | után adja vissza az aktuális könyvtáratpushd |
dirs | listázza vagy törli a következőn keresztül mentett könyvtárak kötegének tartalmátpushd |
Műveletek a változókon | |
let | aritmetikai műveleteket hajt végre a változókon |
eval | lefordítja az argumentumok listáját egy listából parancsokká |
set | megváltoztatja a belső szkriptváltozók értékeit |
unset | változót töröl |
export | változót exportál, elérhetővé téve a gyermekfolyamatok számára |
declare,typeset | változók beállítása és/vagy korlátozása |
getopts | a parancssorból a szkriptnek átadott argumentumok elemzésére szolgál |
Forgatókönyv-kezelés | |
source, .(pont) | futtassa a megadott szkriptet |
exit | a forgatókönyv feltétel nélküli befejezése |
exec | lecseréli az aktuális folyamatot egy új, a parancs által elindított folyamatraexec |
shopt | lehetővé teszi a shell billentyűinek (opcióinak) "menet közben" megváltoztatását |
Csapatok | |
true | nulla kilépési kódot ad vissza (siker) |
false | hibajelző kilépési kódot ad vissza |
type prog | kiírja a prog teljes elérési útját |
hash prog | emlékszik a progihoz vezető útra |
help COMMAND | rövid súgót nyomtat a COMMAND belső parancs használatáról |
A shellben futó feladatok kezelése | |
jobs | a parancshéjban futó feladatok listáját vagy egy adott feladatra vonatkozó információkat a szám szerint jeleníti meg |
fg | átkapcsolja a bemeneti adatfolyamot az aktuális feladatra (vagy egy adott feladatra, ha a száma meg van adva), és folytatja a végrehajtást |
bg | a háttérben folytatja az éppen felfüggesztett feladat (illetve konkrét feladatok, ha azok száma is meg van adva) végrehajtását |
wait | várja a megadott feladatok befejezését |
A legegyszerűbb esetben a szkript egy fájlba írt parancsok egyszerű listája. A parancsfeldolgozónak tudnia kell, hogy fel kell dolgoznia ezt a fájlt, nem csak a tartalmát kell olvasnia. Ezt a shebang nevű speciális konstrukció végzi : #!. A szimbólum #egy megjegyzést ad meg, de ebben az esetben a shebang azt jelenti, hogy e speciális szimbólum után van egy út az értelmezőhöz a szkript végrehajtásához.
A bash parancs szintaxisa egy kiterjesztett Bourne shell parancs szintaxis. A bash parancs végleges szintaktikai specifikációja a GNU Project által terjesztett Bash Reference Manual - ban található . [5]
"Hello world" #!/usr/bin/env bash echo 'Hello World!'Ez a szkript csak két sort tartalmaz. Az első sor közli a rendszerrel, hogy melyik programot használja a fájl futtatásához. A második sor az egyetlen művelet, amelyet ez a szkript végrehajt, valójában kiírja a "Hello world!" a terminálban.
Egy szkript futtathatóvá tételéhez a következő parancsok használhatók:
chmod +rx szkriptnév # olvasási/végrehajtási engedélyt ad bármely felhasználónak chmod u+rx szkriptnév # olvasási/végrehajtási engedélyt csak a szkript "tulajdonosának" adBiztonsági okokból az aktuális könyvtár elérési útja .nem szerepel a környezeti változóban $PATH. Ezért a szkript futtatásához kifejezetten meg kell adnia annak az aktuális könyvtárnak az elérési útját, ahol a szkript található:
./scriptnameEzenkívül egy ilyen fájlt kifejezetten átadhat a Bash értelmezőnekbash végrehajtásra a következő paranccsal :
bash szkriptnévEbben az esetben sem a hozzáférési jogok beállítása, sem a #!kódban szereplő szekvencia használata nem szükséges.
A bash beépített fájlleírókkal rendelkezik : 0 (stdin), 1 (stdout), 2 (stderr).
Az ezekkel és a felhasználó által definiált fogókkal végzett műveletekhez speciális szimbólumok vannak: >(kimenet átirányítás), <(bemenet átirányítás). &A , karakterek -megelőzhetik a leíró számát; például a 2>&1 2. leíró (stderr) átirányítása az 1. leíróra (stdout).
0<filenamevagy<filename | Bemenet átirányítása fájlbólfilename |
1>filenamevagy>filename | A kimenet átirányítása a "fájlnév" fájlba. Ha az opció le van tiltva noclobber, akkor a fájlt felülírja a bejövő adatok |
1>|filenamevagy>|filename | A kimenet átirányítása a "fájlnév" fájlba, a fájlt felülírja a bejövő adatok |
1>>filenamevagy >>filename | A kimenet átirányítása a "fájlnév" fájlba, adatok hozzáfűzése a fájl végéhez. Ha a fájl nem létezik, akkor létrejön |
2>filename | A szabványos hibakimenet átirányítása a "fájlnévre" |
2>>filename | A szabványos hibakimenet átirányítása a "fájlnév" fájlba, adatok hozzáfűzése a fájl végéhez. Ha a fájl nem létezik, akkor létrejön |
&>filename | A kimenet és a hibák átirányítása a "fájlnévre" |
2>&1 | Hibakimenet átirányítása szabványos kimenetre |
A Bash egyéni átirányítási szintaxissal rendelkezik, amelyet a Bourne shell nem támogat. Példa a szabványos kimenet és a szabványos hibák egyidejű átirányítására:
parancs & > fájlEzt könnyebb begépelni, mint a Bourne shell szintaxisban szereplő megfelelő parancsot.
parancs > fájl 2 > & 1Támogatott heredoc szintaxis :
A 2.05b verzió óta a bash át tudja irányítani a szabványos bemenetet egy karakterláncból a következő " here strings " szintaxis használatával:
parancs <<< "standard bemenetként olvasandó karakterlánc"Ha a karakterlánc szóközt tartalmaz, akkor azt idézőjelekbe vagy aposztrófok közé kell tenni, vagy a szóközöket fordított perjellel meg kell szüntetni.
Legyen óvatos: az itt stringek használatával beírt karakterlánc implicit sorlezáró szekvenciát tartalmaz: vagy 1 extra bájt soremelés , vagy 2 extra bájt: kocsivissza és soremelés.
macska - <<< '123' | wc -c # Eredmény: 4 cat < ( echo -n '123' ) | wc -c # Eredmény: 3 wc -c <<< '123' # Eredmény: 4 echo -n 123 | wc -c # Eredmény: 3A 4.1-es verziótól kezdődően [6] lehetővé vált egy sorban egy befejező karaktersorozat, majd közvetlenül utána egy zárójel megadása. Ez hasznos lehet egy here-doc tartalomváltozó hozzárendeléséhez:
var = $( cat - <<'TERMSEQ' Február. Szerezz egy kis tintát és sírj! Írj zokogva februárról Míg a dübörgő latyakos feketén ég tavasszal. TERMSEQ )Ez figyelmeztető üzenetet generál a BASH-ban.
Példa (szabványos kimenet átirányítása fájlba, adatok írása, a fájl bezárása, stdout kiürítése):
# a Filedescriptor(FD) 6 készítése az stdout (FD 1) exec másolataként 6 > & 1 # " test.data " fájl megnyitása az exec 1 írásához >test.data # tartalom előállítása fájl "test.data" exec 1 > & - # az stdout készítése az FD 6 másolatává (reset stdout) exec 1 > & 6 # bezárja az FD6 exec 6 > & -Fájlok megnyitása és bezárása:
# test.data fájl megnyitása exec 6 olvasásához <test.data # olvasás a fájl végéig olvasás közben -u 6 dta do echo " $dta " kész # test.data exec 6 fájl bezárása < & -Külső parancsok kimenetének rögzítése:
# hajtsa végre a 'date' parancsot, és írja be az eredményt a VAR VAR -ba = " $( date ) " echo " $VAR " #kiírja a dátumot az előző sor meghívásakorA nullkarakteres karakterláncok nem támogatottak, a záró sorok elvesznek, ellentétben a csövekkel és más fájl I/O -val .
Vegye figyelembe, hogy a bal oldalon lévő idézőjelek nem kötelezőek. [7]
A Bash csak egydimenziós tömböket valósít meg. Az indexek lehetnek egész számok ("reguláris" tömb ) vagy karakterláncok ( " asszociatív tömb " vagy "hash").
A közönséges és asszociatív tömbökkel való munka szintaxisának egységesítése ellenére az előbbiek nem az utóbbi változatai, sem a végfelhasználó szempontjából, sem magának az értelmezőnek a belső logikája szempontjából.
A bash „asszociatív” kulcsok támogatásának természetes következménye, hogy nagyon korlátozott a többdimenziós tömbök emulálása.
Általános műveletekSzerezzen egy karakterláncot, amely egy tömb összes [8] eleméből áll, szóközzel elválasztva.
értékek = " ${ arr [@] } "Szerezzen be egy karakterláncot egy tömb mind a [8] indexével vagy kulcsával, függetlenül attól, hogy numerikusak vagy szövegesek:
keys = " ${ !arr[@] } "Tömegesen cserélje le a "MAY" részkarakterlánc első előfordulását a "MARCH"-ra a tömb összes [8] elemében, és ad vissza egy karakterláncot, amely a tömb eredményül kapott elemeiből áll, szóközzel elválasztva:
Values = " ${ arr [@]/MÁJUS/MÁRCIUS } "Ugyanaz, de a tömb minden [8] elemében a "MAY" részstring minden előfordulása lecserélődik:
Values = " ${ arr [@]//MÁJUS/MÁRCIUS } "Eddig nem minden, a dokumentációban deklarált lehetőség működik megfelelően a tömbök esetében. Például:
[ -v 'tömb_neve' ]nem működik megfelelően üres tömb esetén. [9]
Műveletek indexelt tömbökönA Bash támogatja az egydimenziós tömböket. A tömbelemek a következő formában inicializálhatók: my_array[xx]. Egy tömböt kifejezetten deklarálhat egy szkriptben a következő direktíva használatával declare:
deklarál -a my_arrayEgy tömb egyes elemei kapcsos zárójelekkel érhetők el: "${my_array[xx]}".
Az indexelt tömb inicializálásának két módja van:
egy)
Tömb =( elem1 elem2 elem3 )2)
temp_array [ 0 ]= elem1 temp_array [ 5 ]= elem temp_array [ 9 ]= elemNElemek hozzáadása egy indexelt tömb végéhez:
deklarál -a arrAnimals arrAnimals =( kutya elefánt ló tehén róka koala teknős ) # A tömb tartalmának megjelenítése: echo " ${ arrAnimals [@] } " # Adjon hozzá egy új elemet az arrAnimals tömb végéhez: "pig" arrAnimals +=( pig ) # És mutasd meg újra a tömb tartalmát: echo " ${ arrAnimals [@] } "Szerezze meg egy tömb első elemét:
echo " ${ arrAnimals [0] } "Mind az indexelt, mind az asszociatív tömbök támogatják az úgynevezett "szeletelést":
# Egy másik módszer egy tömb első elemének echo " ${ arrAnimals [@]: 0 : 1 } " lekérésére # Nyomtasson ki 3 tömbelemet a másodiktól kezdve: echo " ${ arrAnimals [@]: 2 : 3 } "Megjegyzés: asszociatív tömbök esetén az értékek sorrendje általános esetben véletlenszerű lesz (a használt hash függvény határozza meg), így az asszociatív tömbön végzett szeletművelet, bár elfogadható, rendkívül korlátozott hatókörrel rendelkezik. praktikus alkalmazás.
A numerikus indexű tömbökben megengedett a "fordított" ("negatív") címzés, amely lehetővé teszi az elemek elérését a tömb végétől kezdve:
# A tömb utolsó elemének értéke echo " ${ arrAnimals [-1] } " # A tömb utolsó előtti elemének értéke echo " ${ arrAnimals [-2] } " # ... és így tovább.A beépített paranccsal mapfile(szinonimája: readarray) megjelenítheti egy szöveges fájl tartalmát egy indexelt tömbben:
deklarál -a fileWithLogins mapfile fileWithLogins </etc/passwd for (( i = 0 ; i< ${# fileWithLogins [@] } ; i++ )) do echo "Line # $i : ${ fileWithLogins [ $i ] } " kész Asszociatív tömbműveletekA 4.0-s verziótól kezdve a bash bevezette az asszociatív tömbök (úgynevezett hash tömbök) támogatását.
Az asszociatív tömbök deklarálása a -Abeépített parancskulcs segítségével történik declare:
deklarálja -A hshArrayAz indexelt tömbökhöz hasonlóan két különböző szintaxis használható az asszociatív tömbök feltöltésére:
egy)
TheCapitalOf [ Georgia ]= 'Tbilisi' TheCapitalOf [ Australia ]= 'Canberra' TheCapitalOf [ Pakisztán ]= 'Iszlámábád'2)
TheCapitalOf =([ Grúzia ]= 'Tbiliszi' [ Ausztrália ]= 'Canberra' [ Pakisztán ]= 'Iszlámábád' )Az asszociatív tömbök utánozhatják a többdimenziós tömbök támogatását:
deklarál -A a # egy asszociatív tömböt deklarál 'a' i = 1 ; j = 2 # több index inicializálása a [ $i , $j ]= 5 # "5" értéket rendel a "$i,$j" cellához (azaz "1,2") echo ${ a [ $i , $j ] } # tárolt érték nyomtatása innen: "$i,$j"Sajnos a bash jelenlegi verzióiban nem lehet egyszerű hozzárendeléssel átmásolni egy asszociatív tömb tartalmát egy másikba. Ez a probléma csak megkerülhető, amelyre két alapvetően eltérő megközelítés létezik:
1) Emulálja a második hash deklarációját a semmiből úgy, hogy lemásolja az első hash deklarációját:
deklarálja -A hsh1 hsh1 =( ... ) forrás < ( deklaráció -p hsh1 | sed 's/^ declare -A hsh1/declare -A hsh2/' )2) Végezze el a forráskivonat összes [8] elemét, és másolja át őket a célkivonatba:
deklarál -A hsh1 hsh2 hsh1 =( ... ) for k in " ${ !hsh1[@] } " do hsh2 [ " $k " ]= " ${ hsh1 [ " $k " ] } " kész Biztonságos munkavégzés a tömbökkelA tömbök kényelmes módja annak, hogy dinamikusan generált argumentumokat adjunk át függvényeknek vagy parancsoknak. Ebben az esetben a tömb minden eleme külön argumentum.
args =( ls -l -a / ) ls " ${ args [@] } " # ls -l -a / ls ${ args [@] } # ls -l -a / ls ${ args [*] } # ls -l -a /A tömbök ilyen módon történő használatakor azonban óvatosnak kell lenni a tömbök bővítésének sajátosságai miatt speciális karakterek @és indexek használatakor *.
Ha a tömböt idézőjelek közé zárjuk, és az index segítségével bővítjük @, akkor szósor jön létre, ahol minden szó külön eleme a tömbnek. Ha azonban nem teszed idézőjelek közé a tömbbővítést, egészen más eredményt kaphatsz: a tömbelemek részét képező szóközök szóelválasztókká válnak.
args =( -l -a '/home/user/Desktop' ) ls " ${ args [@] } " # a '/home/user/Desktop' könyvtár tartalmának megtekintése ls ${ args [@] } # hiba : a '/home/user/Desktop' és a './desk' könyvtár nem létezikA dupla idézőjelbe zárt indexű tömb *egyetlen sorba bővül, és a tömb összes elemét összefűzi a változóban tárolt határolókkal IFS. Ha nem ad meg dupla idézőjeleket, akkor a tömb ugyanúgy bővül, mint az index használatakor @.
args =( '' usr local bin ) IFS = '/' ls " ${ args [*] } " # a '/usr/local/bin' könyvtár tartalmának megtekintése IFS = '/' ls ${ args [*] } # egyenként felsorolja a '.', './usr', './local' és './bin' könyvtárak tartalmátAmikor egy szöveges változó tartalmából tömböt hoz létre, figyelembe kell vennie a szóközök lehetséges jelenlétét a szövegben. Például a felsorolást tartalmazó karakterláncból tömb létrehozásának egyik módjaként megfontolhatja a határoló karakter szóközzel való helyettesítését. A terek jelenléte a megosztott elemekben azonban maguknak az elemeknek a részekre való széttöredezéséhez vezet.
array =( ${ text //,/ } ) # hibás: a szöveg a 'text' változóban szóköz karaktereket tartalmazhat IFS = ',' array =( $text ) # helyes: a határoló vessző. IFS = ',' read -r -a tömb <<< " $text " # helyes (a 'text' változó tartalmának átirányítása a 'read' parancsra)A parancsok kimeneteként kapott szövegből vagy fájlból tömb létrehozása hibákhoz vezethet, mivel nem csak az újsorok, hanem a tabulátorral ellátott szóközök is alapértelmezés szerint elválasztójelnek számítanak [10] .
array =( " $( ls ) " ) # rossz: a fájlnevekben lévő szóközök két tömbelemre oszthatják a fájlnevet IFS = $'\n' array =( " $( ls ) " ) # helyes: csak a sorfordítások lesznek a határolók mapfile -t array < < ( ls ) # helyes: alternatíva a beépített mapfile parancson keresztülA folyamat az előző parancs kimenetét adja át a következő parancs bemenetének, vagy a shell bemenetének. A módszert gyakran használják parancsok sorozatának egyetlen láncba kapcsolására. A szállítószalagot a csőszimbólum jelzi | .
Példa ( a grep szűrőként működik az stdout-on):
macska fájlnév | grep mintaA logikai VAGY jelölése ||. Feltételes műveleteknél az operátor ||0-t (sikeres) ad vissza, ha az egyik operandus igaz.
A logikai ÉS jelölése &&. A feltételes utasításokban az operátor &&akkor és csak akkor ad vissza 0-t (siker), ha mindkét operandus igaz.
Megjegyzés: A megértésben zavart okozhat az a tény, hogy a parancs true (és bármely parancs sikeres végrehajtása) 0 visszatérési kóddal végződik , siker ( false, ellenkezőleg, nem 0), míg az igaz/hamis logikai érték nem -nulla/ egyenlő nullával.
Példák:
ha hamis ; majd visszhangzik "sikeresen" ; else echo "sikertelenül" ; fi sikertelenül legyen "a=(( 1 && 0 && 123))" ; echo $? ; echo $a 1 # Parancslezáró kód (egy aritmetikai kifejezés kiértékelésének nulla eredménye) 0 # Az "a" változó értéke, egy logikai művelet eredménye if (( 1 && 0 && 123 )) ; akkor visszhangozza az "igaz" ; else echo "hamis" ; fi hamis legyen "a=(( 1 && 123 && -345 ))" ; echo $? ; echo $a 0 # Parancs kilépési kódja 1 # Az "a" változó értéke, logikai művelet eredménye if (( 1 && 123 && -345 )) ; akkor visszhangozza az "igaz" ; else echo "hamis" ; fi igaz false && echo "Siker" || echo "Failed" Sikertelen befejezésA Bash egész számokat tud végezni egy folyamaton belül a parancs és a [11]((…)) változó szintaxisával , az alábbiak szerint: $((…))
VAR = 55 # Állítsa a VAR-t 55-re (( VAR = VAR + 1 )) # Adjon hozzá egyet a VAR-hoz. Figyeljük meg a '$' jel hiányát (( VAR += 1 )) # A növekmény rövidítése (( ++VAR )) # Egy másik módja a VAR eggyel növelésének. Előtagnövelést hajt végre (( VAR++ )) # Egy másik módja a VAR eggyel növelésének. Végrehajt egy postfix növekményes visszhangot $(( VAR * 22 )) # Szorozza meg a VAR-t 22-vel, és adja át az eredményt az echo parancsnak $ [ VAR * 22 ] # Ugyanezt csinálja örökölt módszerrel (( VAR <<3)) # Balra eltolás bitenként (ugyanaz, mint a VAR*8) ((VAR>>3 )) # Biteltolás jobbra (ugyanaz, mint a VAR/8)A parancs ((…))feltételes utasításokban is használható, mivel a kezdeti paramétere 0 vagy 1, ami igaz vagy hamisként értelmezhető:
if (( VAR == Y * 3 + X * 2 )) , akkor echo Igen fi (( Z > 23 )) && echo IgenA parancs ((…))a következő összehasonlító operátorokat támogatja: == != > < >= <=.
A Bash nem támogatja a folyamat közbeni számításokat lebegőpontos számokkal. Csak a Unix Korn shell ( 1993 -as verzió ) és a zsh (4.0-s verzió óta) támogatja ezt a funkciót.
Matematikai műveletek listája: +, -, *, /, **(hatványozás), %(modulo osztás, osztás maradéka), let - lehetővé teszi az aritmetikai parancsok rövidítéseinek használatát (a felhasznált változók számának csökkentése; például: a += bekvivalens a = a + b, stb.).
Érvek:
$$ | az aktuális shell pid (maga a szkriptfolyamat) |
$! | az utolsó folyamat pid-je a háttérben |
$? | az utolsó folyamat visszatérési kódja (függvény vagy szkript) |
$x | ahol x a szkriptnek átadott paraméter száma ( $1stb $2. $0 a szkript utolsó futtatása) |
$# | parancssori argumentumok száma |
$* | mind a [8] argumentum egyetlen karakterláncként (szó) |
$@ | ugyanaz, mint $*, de minden [8] paraméter külön sorként (szóként) jelenik meg |
$- | a szkriptnek átadott zászlók listája |
$_ | az előző parancs utolsó argumentumát tartalmazza |
Beépített változók:
$BASH | a bash végrehajtható fájl elérési útja |
$BASHPID | Az aktuális bash * PID-je (lásd a megjegyzést) |
$BASH_VERSINFO[n] | 6 elemből álló tömb, amely bash verzióinformációkat tartalmaz |
$BASH_VERSION | a rendszerre telepített Bash verziója |
$DIRSTACK | a könyvtárverem tetejének tartalma |
$EDITOR | alapértelmezett szerkesztő |
$EUID | "hatékony" felhasználói azonosító szám (Effective User ID) |
$FUNCNAME | aktuális függvénynév |
$GLOBIGNORE | a helyettesítő karakterek listája, amelyeket figyelmen kívül hagy a fájlnév-csere (globbing) végrehajtásakor |
$GROUPS | csoportok, amelyekhez az aktuális felhasználó tartozik |
$HOME | felhasználói kezdőkönyvtár |
$HOSTNAME | hálózati gazdagépnév |
$HOSTTYPE | gép típusa (a hardver architektúrát azonosítja) |
$IFS | mezőelválasztót a beviteli karakterláncban |
$LC_COLLATE | beállítja a karakterek rendezési sorrendjét, a fájlnevek helyettesítési műveleteiben és a helyettesítő karakteres keresésekben |
$LC_CTYPE | karakterkódolást határoz meg |
$LINENO | A végrehajtható szkript sorszáma |
$MACHTYPE | hardver architektúra |
$OLDPWD | régi munkakönyvtár |
$OSTYPE | operációs rendszer típusa |
$PATH | keresési útvonal (beleértve a címtárakat /usr/bin/, /usr/X11R6/bin/, /usr/local/binstb.) |
$PIPESTATUS | Csatorna (csővezeték) visszatérési kódja |
$PPID | A szülőfolyamat PID (azonosítója). |
$PS1 | parancssori prompt |
$PS2 | másodlagos parancssori prompt, akkor jelenik meg, ha további bevitelt várnak a felhasználótól. Általában ">" |
$PS3 | harmadlagos prompt, akkor jelenik meg, amikor a felhasználónak választania kell egy nyilatkozatbanselect |
$PS4 | 4. szintű prompt, kinyomtatva (módosítva) a hibakeresési kimenet minden sorának elején, amikor a parancsfájlt a -x. Általában „+”, „++” stb. |
$PWD | működő (aktuális) címtár |
$REPLY | az alapértelmezett változó, ahová a felhasználó parancsból származó bemenete íródikread |
$SECONDS | szkript futási ideje (másodpercben) |
$SHELLOPTS | érvényes tolmács opciók listája (csak olvasható) |
$SHLVL | héj fészkelő szintje |
Példa:
$ echo $(visszhang $BASHPID $$) $$ $BASHPID 25680 16920 16920 16920 # | | | | # | | | -- $BASHPID az alhéjon kívül # | | -- $$ az alhéjon kívül # | -- $$ az alhéjon belül # -- $BASHPID az alhéjon belül
A Bash 3.0 támogatja a beépített reguláris kifejezéseket , amelyek szintaxisa hasonló a Perléhez :
[[ string = ~regex ]]A reguláris kifejezések szintaxisa a man 7 regex dokumentációs oldalain található. A kilépési állapot 0, ha a reguláris kifejezés megegyezik a karakterlánccal, és 1, ha nem. A zárójelbe tett részkifejezés értéke [8] egy változón keresztül kapható ${BASH_REMATCH[@]}meg, például:
REGEXP = 'foo(bar)bl(.*)' if [[ "abcfoobarbletch" = ~ $REGEXP ]] then echo "Regex matched string!" echo " $BASH_REMATCH " # nyomatok: foobarbletch echo " ${ BASH_REMATCH [1] } " # nyomatok: bar echo " ${ BASH_REMATCH [2] } " # nyomatok: etch fiA beépített reguláris kifejezések általában gyorsabbak, mint egy külső grep parancs végrehajtása, mivel a megfelelő reguláris kifejezés a bash folyamaton belül kerül végrehajtásra. Ha a reguláris kifejezés vagy karakterlánc szóközöket vagy metakaraktereket (például *vagy ?) tartalmaz, akkor azokat idézőjelek közé kell tenni. Javasoljuk, hogy a fenti példához hasonlóan változót használjon a reguláris kifejezés megtartásához, hogy elkerülje a speciális karakterek kihagyásával kapcsolatos problémákat. Használhatja a bash kimenetet egy opcióval -xannak ellenőrzésére, hogy a bash hogyan elemzi a reguláris kifejezést.
A kapcsos zárójel bővítő funkciót a csh -ból kölcsönözték . Lehetővé teszi tetszőleges karakterlánc létrehozását hasonló technikával, mint a fájlneveknél. A bash-ban azonban a generált karakterláncoknak nem kell fájlneveknek lenniük. Az egyes karakterlánc-bővítések eredménye nincs rendezve, a sorrend balról jobbra haladva megmarad:
# Ez a bash echo jellemzője a { p,c,d,b } e # ape ace ade abeNe használja ezt a funkciót, ha a szkriptet át kell vinni, mert a hagyományos szkriptekben a karakterlánc-bővítés nem működik:
# A hagyományos shell nem adja ugyanazt az eredményt echo a { p,c,d,b } e # a{p,c,d,b}eHa a zárójel-bővítést helyettesítő karakterekkel együtt használja, először a zárójeleket bontja ki, majd az eredményt a szokásos módon dolgozza fel. Így az aktuális könyvtárban található JPEG és PNG képek listája a következőképpen érhető el:
ls*. { jpg,jpeg,png } # szögletes zárójelek *.jpg *.jpeg *.png formátumra bővülnek, ami után helyettesítő karakteres keresés történikA Bash indításkor számos különböző szkriptből hív meg parancsokat.
Amikor a bash-t interaktív bejelentkezési shellként hívják meg , az első dolga az, hogy beolvassa és végrehajtja a parancsokat egy fájlból /etc/profile, ha ez a fájl létezik. A fájl elolvasása után a következő fájlokat nézi meg a következő sorrendben: ~/.bash_profile, ~/.bash_loginés ~/.profile, az első létező és olvasható parancsokat olvassa be és hívja meg. Kilépéskor a bash beolvassa és végrehajtja a parancsokat a ~/.bash_logout.
Amikor egy interaktív shell elindul, de nem bejelentkezéshez, a bash beolvassa és végrehajtja a parancsokat a fájlokból /etc/bash.bashrc, és ~/.bashrcha léteznek. Ez az opcióval felülírható -norc. Az opció -rcfile filearra kényszeríti a bash-t, hogy a fájlból származó parancsokat használja a és filehelyett . /etc/bash.bashrc~/.bashrc
A szkript első sorának egy bejegyzésnek kell lennie, #!/bin/bashha ismert a végrehajtható fájl abszolút elérési útja, vagy #!/usr/bin/env bashautomatikusan meghatározza a végrehajtható fájl elérési útját az env paranccsal a PATH környezeti változó használatával [12] .
A bash-specifikus tulajdonságokkal írt shell-szkriptek nem működnek a Bourne shell-t (sh) vagy annak megfelelőjét használó rendszereken, kivéve, ha a bash-t további shellként telepítették. Ez a probléma különösen fontossá vált, amikor 2006 októberében az Ubuntu elkezdte a Debian Almquist parancsértelmezőt (dash) szállítani alapértelmezett parancsfájlhéjként, ami számos szkript meghibásodását okozta.
Sok olyan program létezik, amely lehetővé teszi grafikus felület létrehozását a bash szkriptekhez.
Unix parancsok | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
|
Felhasználói felület Unix - szerű rendszereken | |||||||||
---|---|---|---|---|---|---|---|---|---|
Asztali környezetek |
| ||||||||
Grafikus héjak | |||||||||
Ablakkezelők |
| ||||||||
A Wayland Protokollról | |||||||||
Parancshéjak | |||||||||
X Window System |
|
GNU projekt | ||
---|---|---|
Sztori | ||
Licencek |
| |
Szoftver _ |
| |
Személyiségek |
| |
Egyéb témák |
|
POSIX.1-2008 | Közművek|
---|---|
|