Bash
| Bash | ||
|---|---|---|
| skaldel _ | ||
|
| ||
|
Skærmbillede af en Bash-session, taget på GNU/Linux | ||
| Generel information | ||
| programtype | gratis software | |
| Forfatter | Brian Fox | |
| Udvikler | GNU projekt | |
| Første udgivelse | 8. juni 1989 | |
| Licens | GPLv3 | |
| Sprog | Flersproget ( gettext ) | |
| Teknisk information | ||
| Planlagt ind | C | |
| Understøttede platforme | Multi platform | |
| Versioner | ||
| Seneste stabile version | 5.2 ( info ) (26. september 2022 (18 dage)) | |
| læsbare filer | ||
| bash-script | ||
| Links | ||
GNU Bash eller simpelthen Bash ( Bourne -a gain shell ) er en populær kommandolinjebrugergrænseflade , specifikt en Unix shell ; samt et scriptsprog . Bash blev oprindeligt skrevet af Brian Fox til GNU -operativsystemet og var beregnet til at være den gratis softwareerstatning for Bourne-skallen . [ 1 ] [ 2 ] Først udgivet i 1989, [ 3 ] er den blevet brugt i vid udstrækning som standard login- fortolker til de fleste GNU/Linux-distributioner og også Mac OS. X fra Apple op til version 10.15. [ 4 ] En version er også tilgængelig til Windows 10 og Android . [ 5 ] Det er også standard brugerskal i Solaris 11 . [ 6 ]
Bash er en shell , der normalt kører i et tekstvindue, hvor brugeren skriver kommandoer i teksttilstand. Bash kan også læse og udføre kommandoer fra en fil, kaldet et script eller 'script' . Som alle Unix-fortolkere understøtter den filnavnsgruppering ( wildcard-matchning), pipes , her dokumenter , kommandosubstitution , variabler og kontrolstrukturer til tilstands- og iterationstests . Reserverede ord , syntaks , variabler med dynamisk omfang og andre grundlæggende sprogfunktioner kopieres fra sh . Andre funktioner, for eksempel historie , er kopieret fra csh og ksh . Bash er en POSIX -kompatibel skal , men med forskellige udvidelser.
Skallens navn er et akronym for 'Bourne-igen-skal', et ordspil på navnet på Bourne-skallen, det erstatter [ 7 ] og begrebet "født igen" (født-igen). [ 8 ] [ 9 ]
Et sikkerhedshul i Bash, der dateres til version 1.03 (august 1989), [ 10 ] ved navn Shellshock , blev opdaget i begyndelsen af september 2014 og fik udbredt mediebevågenhed. Det udløste hurtigt en række cyberangreb på internettet . [ 11 ] [ 12 ] [ 13 ] Patches til at rette fejlene blev gjort tilgængelige kort efter at fejlene blev identificeret.
Historie
Brian Fox begyndte at kode Bash den 10. januar 1988 [ 14 ] efter Richard Stallman blev utilfreds med en tidligere udviklers manglende fremskridt. [ 15 ] Stallman og Free Software Foundation (FSF) betragtede en gratis fortolker, der kunne køre eksisterende shell-scripts, så strategisk for et helt gratis system bygget af BSD og GNU-kode, at dette var et af de få projekter, de selv finansierede med Fox. varetage arbejdet som FSF-medarbejder. [ 15 ] [ 16 ] Fox udgav Bash som en betaversion, version .99, den 8. juni 1989 [ 3 ] og forblev hovedbidragyderen indtil midten af 1992 [ 17 ] og midten af 1994, [ 18 ] hvor han blev fyret fra FSF [ 19 ] og hans ansvar blev overført til en anden tidlig bidragyder, Chet Ramey. [ 20 ] [ 21 ] [ 22 ]
Siden da er Bash blevet den mest populære skal blandt brugere af GNU/Linux-distributioner, og er blevet den interaktive standardskal i de forskellige GNU/Linux-distributioner (med distributioner, der refererer til ethvert operativsystem, der har kernen som sin kerne). af linux) [ 23 ] [ 24 ] (selvom Almquist -fortolkeren kan være standard script-fortolkeren) og i versioner af Apples MacOS før Catalina i oktober 2019. [ 25 ] [ 26 ] [ 27 ] Bash er også blevet overført til Microsoft Windows og distribueret med Cygwin og MinGW , til DOS af DJGPP- projektet , til Novell NetWare og til Android via forskellige terminalemuleringsapplikationer.
I september 2014 opdagede Unix/Linux-specialisten Stéphane Chazelas [ 28 ] en sikkerhedsfejl i programmet. Fejlen, der først blev afsløret den 24. september, blev kaldt Shellshock og tildelt numrene CVE-2014-6271 , CVE-2014-6277 [ 29 ] og CVE-2014-7169 . Fejlen blev betragtet som alvorlig, da CGI -scripts, der bruger Bash, kunne være sårbare, hvilket tillader vilkårlig kodeudførelse . Fejlen var relateret til den måde Bash videregiver funktionsdefinitioner til subshells via miljøvariabler . [ 30 ]
Bash-syntaks
Bash-kommandosyntaksen er et supersæt af kommandoer baseret på Bourne-fortolkerens syntaks. Den endelige specifikation af Bash-kommandosyntaksen kan findes i Bash Reference Manual distribueret af GNU-projektet. Dette afsnit fremhæver nogle af dets unikke funktioner.
De fleste Bourne shell scripts ('shell scripts ' ) kan udføres af Bash uden ændringer, med undtagelse af de Bourne shell eller shell scripts, der refererer til specielle Bourne variabler eller bruger en intern Bourne rækkefølge. Bashs kommandosyntaks inkluderer ideer lånt fra Korn shell (ksh) og C shell (csh) fortolkere, såsom kommandolinjeredigering, kommandohistorik, mappestak, $RANDOM og $PPID variabler og POSIX kommando substitution syntaks : $(. ..) . Når det bruges som en interaktiv shell, giver Bash autofuldførelse af programnavne, filnavne, variabelnavne osv., når brugeren trykker på TAB-tasten.
Bashs syntaks har mange udvidelser, som ikke leveres af Bourne-fortolkeren. Flere af de førnævnte udvidelser er anført nedenfor.
Adgang til argumenter
Bash-scripts modtager de argumenter, du sender til shellen, som $1, $2, …, $n. Du kan få det samlede antal argumenter med symbolet $#.
Ved at bruge $# er det muligt at kontrollere antallet af argumenter givet til scriptet, før du gør noget med dem:
if [ $# -lt 2 ] ; derefter
ekko "Du skal bestå to argumenter."
afkørsel 1
fi
En anden måde at få adgang til argumenterne er gennem $@- arrayet , hvorigennem du kan iterere over alle givne argumenter:
for arg i " $@ "
gør
echo " $arg "
udført
Matematiske operationer med heltal
En væsentlig begrænsning ved Bourne-fortolkeren er, at den ikke kan udføre heltalsberegninger uden at starte en ekstern proces. I stedet kan en Bash-proces udføre heltalsberegninger ved hjælp af ((...)) kommandoen og $[...] variable syntaks som følger:
VAR = 55 # Tildeler heltalsværdien 55 til variablen VAR.
(( VAR = VAR + 1 )) # Tilføj en til variablen VAR. Bemærk fraværet af tegnet '$'.
(( ++VAR )) # En anden måde at tilføje en til VAR. Fortrin i C-stil
(( VAR++ )) # En anden måde at tilføje en til VAR. C-stil postincrement.
echo $ [ VAR * 22 ] # Multiplicerer VAR-variablen med 22 og erstatter kommandoen med resultatet.
echo $(( VAR * 22 )) # En anden måde at gøre det samme på.
Kommandoen ((...)) kan også bruges i betingede sætninger, da dens returkode er 0 eller 1 afhængigt af om betingelsen er sand eller falsk:
hvis (( VAR == Y * 3 + X * 2 )),
så
ekko Hvis
fi
(( Z > 23 )) && ekko Ja
Kommandoen ((...)) understøtter følgende relationelle operatorer : ' == ', ' != ', ' > ', ' < ', ' >= ' og ' <= '.
En Bash-proces kan ikke udføre flydende kommaberegninger . De eneste Unix-skaller, der er i stand til dette, er Korn Shell (version 1993) og zsh (version 4.0 eller nyere).
Input/output omdirigeringer
Bashs syntaks giver mulighed for forskellige former for input/output- omdirigering , som den traditionelle Bourne-fortolker mangler. Bash kan omdirigere standardoutput og standardfejlstrømme på samme tid ved hjælp af syntaksen :
kommando > & fil
hvilket er enklere end at skrive den tilsvarende Bourne-kommando, " kommando > fil 2>&1 ". Siden version 2.05b kan Bash omdirigere standardinput fra en streng ved hjælp af følgende syntaks (benævnt " her strenge "):
kommando <<< "streng at læse som standard input"
Hvis strengen indeholder mellemrum, skal der bruges anførselstegn.
Eksempel : Omdiriger standardoutput til en fil, skriv data, luk filen og nulstil stdout
# lav filbeskrivelse 6 til en kopi af stdout (filbeskrivelse 1)
exec 6 > & 1
# åben fil "test.data" til at skrive
exec 1 >test.data
# output noget indhold
ekko "data:data: data"
# hent original stdout, ved at gøre det til en kopi af fildeskriptor 6
exec 1 > & 6
# luk filbeskrivelse 6
exec 6 > & -
Åbn og luk filer
# åben test.data-fil til læsning af
exec 6 <test.data
# læst til slutningen af fil
mens læsning -u 6 dta
do
echo " $dta "
done
# close test.data file
exec 6 < & -
Fang output fra eksterne kommandoer
# kører 'find' og gemmer resultaterne i VAR
# finder filnavne, der slutter med bogstavet "h"
VAR = $( find . -navn "*h" )
Regulære udtryk
Bash 3.0-processer understøtter matchning af regulære udtryk ved hjælp af følgende syntaks, der minder om Perl :
[[ streng = ~ regex ]]
Syntaksen for regulære udtryk er den samme som dokumenteret i regex (3) man-siden. Exit-statussen for ovenstående kommando er 0, hvis strengen matcher det regulære udtryk, og 1, hvis de ikke matcher. De dele, der er omgivet af parenteser, kan tilgås i regulære udtryk ved at bruge BASH_REMATCH-skalvariablen som følger:
hvis [[ foobarbletch = ~ 'foo(bar)bl(.*)' ]]
så
ekko Regex matcher!
echo $BASH_REMATCH -- udgange: foobarbletch
echo ${ BASH_REMATCH [1] } -- udgange: bar
echo ${ BASH_REMATCH [2] } -- udgange: etch
fi
Denne syntaks giver overlegen ydeevne i forhold til at starte en separat proces til at udføre en grep-kommando , fordi matchningen af det regulære udtryk finder sted i selve Bash-processen. Hvis det regulære udtryk eller streng indeholder mellemrum eller et fortolkningsmetategn ( såsom ' * ' eller ' ? '), skal det være omgivet af anførselstegn.
Backslash escapement
Ord med formen $'streng' behandles på en særlig måde. Disse ord udvides til streng , med omvendt skråstreg-escaped tegn erstattet som angivet af C-programmeringssproget . Backslash escape-sekvenser afkodes som følger:
| Backslash Escape |
Udvides til... |
|---|---|
| \b | Et backspace-tegn |
| \og | en flugtkarakter |
| \F | Et linjeskifttegn ( formfeed ) |
| \n | Et nyt linjetegn |
| \r | En vognretur-karakter |
| \t | En vandret fane |
| \v | En lodret fane |
| \\ | En omvendt skråstreg |
| \' | Et enkelt citat tegn |
| \nnn | Det 8-bit tegn, hvis værdi er det oktale tal nnn (et til tre cifre) |
| \xHH | Det 8-bit tegn, hvis værdi er det hexadecimale tal HH (et eller to hexadecimale cifre) |
| \cx | Et kontrol-X-tegn |
Det udvidede resultat er omgivet af enkelte anførselstegn, som om $ -tegnet ikke var til stede.
En citeret streng med dobbelte anførselstegn foran et $-tegn ( $"..." ) vil blive oversat i henhold til den aktuelle lokalitet. Hvis det var C eller POSIX, ignoreres symbolet $. Hvis strengen er oversat og erstattet, vil erstatningen blive sat i dobbelte anførselstegn.
Bash init scripts
Når Bash starter, udfører den de kommandoer, der findes i forskellige scripts.
Når Bash påkaldes som en interaktiv shell til login ( login shell ), eller som en ikke-interaktiv shell med --login muligheden , læser og udfører den først kommandoer fra filen /etc/profile , hvis den findes. . Den leder derefter efter ~/.bash_profile , ~/.bash_login og ~/.profile , i den rækkefølge, og læser og udfører kommandoerne fra den første, der eksisterer og kan læses. Indstillingen --noprofile kan bruges, når du starter en ny shell for at forhindre denne adfærd.
Når en shell-session slutter, læser og udfører Bash kommandoerne i ~/.bash_logout , hvis nogen.
Når en interaktiv fortolker, der ikke er en login-shell , starter, læser og udfører Bash kommandoer fra ~/.bashrc , hvis en sådan findes. Dette kan undgås ved at bruge --norc- indstillingen . Indstillingen --rcfile fil vil tvinge Bash til at læse og udføre kommandoer fra filen i stedet for ~/.bashrc .
Når Bash starter ikke-interaktivt, for eksempel for at køre et andet shell-script, søger den efter miljøvariablen BASH_ENV , udvider dens værdi, hvis den findes, og bruger den som navnet på filen til at læse og udføre. Bash opfører sig, som om følgende kommando blev udført:
if [ -n " $BASH_ENV " ] ; derefter . " $BASH_ENV " ; fi
men værdien af PATH -variablen bruges ikke til at finde filen.
Hvis Bash kaldes med navnet sh , forsøger den at replikere adfærden af ældre versioner af sh , mens den opretholder overensstemmelse med POSIX- standarden . Når det påkaldes som et interaktivt login, eller ikke-interaktivt skal med --login- indstillingen , forsøger det først at læse og udføre kommandoer fra /etc/profile og ~/.profile , i den rækkefølge. Indstillingen --noprofile kan bruges til at undgå denne adfærd.
Når det påberåbes som et interaktivt login med navnet sh , søger Bash efter ENV - variablen , udvider dens værdi, hvis den er defineret, og bruger den udvidede værdi som navnet på en fil til at læse og udføre. Som en fortolker kaldet som sh forsøger den ikke at læse og udføre kommandoer fra andre startfiler, og --rcfile- indstillingen har ingen effekt. En ikke-interaktiv shell kaldet med navnet sh forsøger ikke at læse andre startfiler. Når det kaldes som sh , går Bash i posix -tilstand efter at have læst startfilerne.
Når Bash startes i POSIX-tilstand, for eksempel med --posix- indstillingen , følger den POSIX-standarden for opstartsfiler. I denne tilstand udvider de interaktive skaller ENV -variablen , og kommandoer læses fra og udføres fra filen, hvis navn er værdien af den udvidede variabel. Ingen andre boot-filer læses.
Bash forsøger at bestemme, hvornår den køres af en ekstern shell-dæmon, typisk rshd . Hvis Bash bestemmer, at den udføres af rshd , læser og udfører den kommandoer fra ~/.bashrc , hvis denne fil findes og kan læses. Den vil ikke gøre dette, hvis den kaldes som sh . Indstillingen --norc kan bruges til at undgå denne adfærd, og --rcfile muligheden kan bruges til at tvinge en anden fil til at blive læst, men rshd kalder normalt ikke skallen med disse muligheder eller tillader dem at blive specificeret.
Bashisme
Bashisme er brugen af Bash-funktioner, der ikke er dækket af POSIX- specifikationerne for skaller . Generelt anbefales det at undgå dem, for at tillade portabilitet af scripts til andre operativsystemer. [ 31 ] [ 32 ]
Se også
Referencer
- ↑ Richard Stallman (videresendt med kommentarer af Chet Ramey) (10. februar 1988). " GNU + BSD = ? ". (Google-gruppe) . URL tilgået den 22. marts 2011.
- ^ Hamilton, Naomi (30. maj 2008), "The AZ of Programming Languages: BASH/Bourne-Again Shell" , Computerworld : 2, arkiveret fra originalen den 6. juli 2011 , hentet den 21. marts 2011 , "When Richard Stallman besluttede at skabe en fuld erstatning for de dengang behæftede Unix-systemer, vidste han, at han i sidste ende skulle have erstatninger for alle de almindelige hjælpeprogrammer, især standardskallen, og disse erstatninger skulle have acceptabel licens. » .
- ^ a b "Google Grupper" . groups.google.com . Hentet 28. december 2019 .
- ↑ "macOS Catalina vil bruge zsh i stedet for bash som standard shell." . Genbeta . 4. juni 2019 . Hentet 13. juli 2020 .
- ↑ «Vil du køre Linux på Windows 10? Brug WSL, her er hvordan.» . Windows Central (på engelsk) . 9. december 2019 . Hentet 28. december 2019 .
- ↑ "Ændringer af funktioner i brugermiljøet - Overgang fra Oracle Solaris 10 til Oracle Solaris 11" . docs.oracle.com . Hentet 28. december 2019 .
- ↑ "Jeg får næsten en Linux-editor og compiler" . Dr Dobbs . Hentet 28. december 2019 .
- ↑ « " Bourne Again Shell" er et spil om navnet Bourne Shell, som var den sædvanlige shell på Unix. " » .
- ^ "Wayback Machine" . web.archive.org . 9. marts 2011. Arkiveret fra originalen 9. marts 2011 . Hentet 28. december 2019 .
- ^ "oss-sec: Re: Shellshock tidslinje (var: CVE-2014-6271: fjernudførelse af kode gennem bash)" . seclists.org . Hentet 28. december 2019 .
- ↑ kl. 20:27, John Leyden 24. sep. 2014. "Patch Bash NU: 'Shellshock'-fejl sprænger OS X, Linux-systemer på vid gab" . www.theregister.co.uk (på engelsk) . Hentet 28. december 2019 .
- ↑ Perlroth, Nicole (25. september 2014). "Sikkerhedseksperter forventer, at 'Shellshock'-softwarefejlen i Bash er betydelig" . The New York Times (på amerikansk engelsk) . ISSN 0362-4331 . Hentet 28. december 2019 .
- ↑ "Hackere hopper på Shellshock Bash-vognen | ZDNet» . web.archive.org . 14. maj 2016. Arkiveret fra originalen 14. maj 2016 . Hentet 28. december 2019 .
- ^ "shell.c" .
- ^ a b "Google Grupper" . groups.google.com . Hentet 28. december 2019 .
- ^ " " Om GNU - projektet " " .
- ^ "Google Grupper" . groups.google.com . Hentet 28. december 2019 .
- ↑ "Hvad er GNU: Bash—The GNU Shell | LinuxJournal» . www.linuxjournal.com . Hentet 28. december 2019 .
- ^ "2010-10-31 Chet Ramey Early Bash Dates | Intellektuelle Værker | edb» . Scribd . Hentet 28. december 2019 .
- ^ "Google Grupper" . groups.google.com . Hentet 28. december 2019 .
- ^ "Google Grupper" . groups.google.com . Hentet 28. december 2019 .
- ^ "Google Grupper" . groups.google.com . Hentet 28. december 2019 .
- ^ Bresnahan, Christine; Blum, Richard (28. april 2015). CompTIA Linux+ Drevet af Linux Professional Institute Studievejledning: eksamen LX0-103 og eksamen LX0-104 . John Wiley & sønner. ISBN 978-1-119-02122-3 . Hentet 28. december 2019 .
- ↑ Danesh, Arman; Jang, Michael (14. juli 2006). Mestring af Linux (på engelsk) . John Wiley & sønner. ISBN 978-0-7821-5277-7 . Hentet 28. december 2019 .
- ^ Foster-Johnson, Eric; Welch, John C.; Anderson, Micah (1. april 2005). Begyndelse af Shell Scripting . John Wiley & sønner. ISBN 978-0-7645-9791-6 . Hentet 28. december 2019 .
- ↑ "Bash (Unix shell)" forkert med selvhenvisning ( hjælp ) . Wikipedia (på engelsk) . 27. december 2019 . Hentet 28. december 2019 .
|url= - ↑ Warren, Tom (4. juni 2019). "Apple erstatter bash med zsh som standardskal i macOS Catalina" . The Verge (på engelsk) . Hentet 28. december 2019 .
- ↑ "Linux bash exit status og hvordan man indstiller exit status i bash - Techolac" . Techolac - Computer Technology News (på amerikansk engelsk) . 10. juni 2019 . Hentet 28. december 2019 .
- ^ "CVE - CVE-2014-6277" . cve.mitre.org . Hentet 28. december 2019 .
- ↑ "Bash specialfremstillede miljøvariabler kodeinjektionsangreb" . Red Hat kundeportal . Hentet 28. december 2019 .
- ^ "bashisme" . din ordbog . _ Hentet 21. maj 2020 .
- ^ "bashisme" . wordnik (på engelsk) . Hentet 21. maj 2020 .
Eksterne links
Wikimedia Commons har en mediekategori for Bash .
Wikibooks er vært for en bog eller manual om Bash .- officiel hjemmeside
- Ordreliste
- bash hjemmeside
- bash(1) : GNU Bourne-Again SHell – Generelle kommandoer i Ubuntu - manualen
- Bash-Ofte stillede spørgsmål
- Bash 3.0-meddelelse
- GNU Bash Reference Manual , ( HTML version ) af Chet Ramey og Brian Fox , ISBN 0-9541617-7-7
Bash-vejledninger fra Linux Documentation Project :
- Bash programmering
- Bash-guide for begyndere
- BASH-programmering - Introduktion SÅDAN gør du
- Avanceret Bash-Scripting Guide
Andre guider og tutorials:
- Om Shells
- Begyndere Bash Tutorial
- Fremme i Bash Shell tutorial
- Linux Know-How inklusive Bash Guide for begyndere
- Introduktion og forskellige eksempler /basic/medium/avanceret i Bash script