Bash (Unix shell)
Bash-kommandosyntaksen er et overordnet sett av Bourne shell-kommandosyntaksen. Bash støtter brace utvidelse, kommandolinje ferdigstillelse (Programmerbar Ferdigstillelse), grunnleggende feilsøking og signalhåndtering (ved hjelp av trap
) siden bash 2.05 a blant andre funksjoner. Bash kan utføre det store flertallet Av Bourne shell skript uten modifikasjon, med unntak Av Bourne shell skript snubler inn fringe syntaks atferd tolket annerledes I Bash eller forsøker å kjøre et system kommando matche en nyere Bash builtin, etc. Bash-kommandosyntaks inneholder ideer hentet fra KornShell (ksh) og c-skallet (csh), for eksempel kommandolinjeredigering, kommandohistorikk (history
kommandoen), katalogstakken, $RANDOM
og $PPID
variabler og POSIX-kommandosubstitusjonssyntaks $(…)
.Når en bruker trykker på tab-tasten i en interaktiv kommando-shell, Bash bruker automatisk kommandolinje ferdigstillelse, siden beta versjon 2.04, for å matche delvis skrevet programnavn, filnavn og variable navn. Bash-kommandolinjens fullføringssystem er veldig fleksibelt og tilpassbart, og er ofte pakket med funksjoner som fullfører argumenter og filnavn for bestemte programmer og oppgaver.
Bashs syntaks har mange utvidelser som mangler I Bourne-skallet. Bash kan utføre heltallsberegninger («aritmetisk evaluering») uten å gyte eksterne prosesser. Den bruker ((…))
kommandoen og $((…))
variabel syntaks for dette formålet. Dens syntaks forenkler i / O omdirigering. For eksempel kan den omdirigere standardutgang (stdout) og standardfeil (stderr) samtidig ved hjelp av operatøren&>
. Dette er enklere å skrive enn Bourne shell-ekvivalenten ‘command > file 2>&1
‘. Bash støtter prosesserstatning ved hjelp av syntaksen <(command)
og >(command)
, som erstatter utdata fra (eller inngang til) en kommando der et filnavn normalt brukes. (Dette implementeres gjennom / proc / fd / ikke-navngitte rør på systemer som støtter det, eller via midlertidige navngitte rør der det er nødvendig).Når du bruker nøkkelordet ‘funksjon’, Er bash-funksjonsdeklarasjoner ikke kompatible Med Bourne/Korn/POSIX-skript (KornShell har det samme problemet når du bruker ‘funksjon’), Men Bash aksepterer den samme funksjonsdeklarasjonssyntaksen som Bourne – og Korn-skjellene, og ER POSIX-konform. På grunn av disse og andre forskjeller, Bash shell skript er sjelden kjøres under Bourne eller Korn shell tolker mindre bevisst skrevet med at kompatibilitet i tankene, som blir mindre vanlig Som Linux blir mer utbredt. Men I POSIX-modus samsvarer Bash med POSIX nærmere.
Bash støtter her dokumenter. Siden versjon 2.05 B Bash kan omdirigere standardinngang (stdin)fra en» her streng » ved hjelp av operatøren<<<
.Bash 3.0 støtter i prosessen regulære uttrykk matching ved hjelp av en syntaks som minner Om Perl.i februar 2009 Introduserte Bash 4.0 støtte for assosiative arrays. Associative array indekser er strenger, på en måte som LIGNER AWK eller Tcl. De kan brukes til å etterligne flerdimensjonale arrays. Bash 4 bytter også sin lisens Til GPLv3; Noen brukere mistenker at denne lisensendringen er grunnen Til At MacOS fortsetter å bruke eldre versjoner. Apple sluttet endelig å bruke Bash i sine operativsystemer med utgivelsen Av MacOS Catalina i 2019.
Brace expansionEdit
Brace expansion, også kalt veksling, er en funksjon kopiert Fra c-skallet. Det genererer et sett med alternative kombinasjoner. Genererte resultater trenger ikke eksistere som filer. Resultatene av hver utvidet streng er ikke sortert og venstre til høyre rekkefølge er bevart:
$ 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
Brukere bør ikke bruke brace utvidelser i bærbare shell skript, Fordi Bourne skallet ikke produserer samme utgang.
$ # 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
når brace-utvidelse kombineres med jokertegn, utvides klammeparentesene først, og deretter erstattes de resulterende jokertegnene normalt. Derfor kan en liste OVER JPEG-og PNG-bilder i gjeldende katalog oppnås ved å bruke:
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.
i tillegg til veksling, kan spenne utvidelse brukes for sekvensielle områder mellom to heltall eller tegn atskilt med doble prikker. Nyere versjoner Av Bash tillater et tredje heltall å spesifisere økningen.
$ 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
når bøyleutvidelsen kombineres med variabel ekspansjon, utføres den variable utvidelsen etter bøyleutvidelsen, noe som i noen tilfeller kan nødvendiggjøre bruk av eval
innebygd, slik:
$ 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
Når Bash starter, utfører den kommandoene i en rekke dot-filer. I motsetning Til Bash shell-skript, har dot-filer vanligvis ikke utføringstillatelse aktivert eller et tolkedirektiv som #!/bin/bash
.
Legacy-kompatibel Bash startup exampleEdit
skjelettet ~/.bash_profile
nedenfor er kompatibelt Med Bourne-skallet og gir semantikk som ligner på csh for ~/.bashrc
og ~/.bash_login
&& cmd
er en kortslutningsevaluering som tester om filnavnet eksisterer og er lesbart, hopper over delen etter &&
hvis det ikke er det.
&& . ~/.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
operativsystemproblemer i Bash startupEdit
Noen Versjoner Av Unix og Linux inneholder Bash systemoppstartsskript, vanligvis under/etc
kataloger. Bash kaller disse som en del av standardinitialiseringen, men andre oppstartsfiler kan lese dem i en annen rekkefølge enn den dokumenterte Bash-oppstartssekvensen. Standardinnholdet i rotbrukerens filer kan også ha problemer, samt skjelettfiler systemet gir til nye brukerkontoer ved oppsett. Oppstartsskriptene som starter x window-systemet, kan også gjøre overraskende ting med brukerens Bash-oppstartsskript i et forsøk på å sette opp bruker-miljøvariabler før du starter vindusbehandleren. Disse problemene kan ofte løses ved hjelp av en ~/.xsession
eller ~/.xprofile
– fil for å lese ~/.profile
— som gir miljøvariablene Som Bash shell windows gytt fra vindusbehandleren trenger, for eksempel xterm Eller Gnome Terminal.
PortabilityEdit
Påkalle Bash med --posix
alternativet eller angir set -o posix
I et skript fører Til At Bash samsvarer svært tett MED POSIX 1003.2-standarden. Bash shell skript beregnet for portabilitet bør ta hensyn til MINST POSIX shell standard. Noen bash funksjoner som ikke finnes I POSIX er:
- Visse utvidede invokasjonsalternativer
- Spenne utvidelse
- Matriser og assosiative matriser
- den doble braketten
] utvidet testkonstruksjon og dens regex-matchende
- den dobbelte parentesene aritmetiske evalueringskonstruksjonen (kun
(( ... )) ;
$ ((... ))
ER POSIX) - Visse strengmanipuleringsoperasjoner i parameterutvidelse
- prosesssubstitusjon
- Bash-spesifikke builtins
- Koprosesser
- $EPOKESEKUNDER og $epokrealtime variabler
lokalFor omfangsvariabler
hvis et stykke kode bruker en slik funksjon, kalles det en «bashism»-et problem for bærbar bruk. Debians checkbashisms
Og Vidar Holens shellcheck
kan brukes til å sikre at et skript ikke inneholder disse delene. Listen varierer avhengig av det faktiske målskallet: Debians policy tillater noen utvidelser i deres skript (som de er i dash
), mens et skript som har til hensikt å støtte PRE-POSIX Bourne-skall, som autoconfs konfigurer
, er enda mer begrenset i funksjonene de kan bruke.
hurtigtasterrediger
Bash bruker readline for å gi hurtigtaster for kommandolinjeredigering ved hjelp Av Standard (Emacs) tastebindinger. Vi-bindinger kan aktiveres ved å kjøre set -o vi
.
prosesshåndteringrediger
Bash-skallet har to utførelsesformer for kommandoer: batch og samtidig modus.
for å utføre kommandoer i batch (dvs. i rekkefølge) må de skilles med tegnet»;», eller på separate linjer:
command1; command2
i dette eksemplet, når command1 er ferdig, utføres command2.En bakgrunnsutførelse av command1 kan skje ved å bruke (symbol &) på slutten av en utførelseskommando, og prosessen vil bli utført i bakgrunnen, og returnerer umiddelbart kontrollen til skallet og tillater fortsatt utførelse av kommandoer.
command1 &
Eller for å ha en samtidig utførelse av to command1 og command2, må De utføres I Bash-skallet på følgende måte:
command1 & command2
i dette tilfellet utføres command1 i bakgrunnen & – symbolet, og returnerer umiddelbart kontrollen til skallet som utfører command2 i forgrunnen.En prosess kan stoppes og kontrollen returneres til bash ved å skrive Ctrl + z mens prosessen kjører i forgrunnen.
en liste over alle prosesser, både i bakgrunnen og stoppet, kan oppnås ved å kjøre jobs
:
$ jobs- Running command1 &+ Stopped command2
i utgangen refererer tallet i parentes til jobb-id. Plusstegnet betyr standardprosessen for bg
og fg
. Teksten «Kjører » og» Stoppet » refererer Til Prosessstatusen. Den siste strengen er kommandoen som startet prosessen.
tilstanden til en prosess kan endres ved hjelp av ulike kommandoer. Kommandoenfg
bringer en prosess til forgrunnen, mensbg
setter en stoppet prosess som kjører i bakgrunnen. bg
og fg
kan ta en jobb-id som sitt første argument, for å angi prosessen som skal utføres. Uten en bruker de standardprosessen, identifisert med et plustegn i utgangen av jobs
. Kommandoenkill
kan brukes til å avslutte en prosess for tidlig, ved å sende det et signal. Jobb-iden må angis etter et prosenttegn:
kill %1
Betinget executionEdit
Bash forsyninger» betinget execution » kommando skilletegn som gjør kjøring av en kommando betinget av avslutningskoden satt av en presedens kommando. For eksempel:
cd "$SOMEWHERE" && ./do_something || echo "An error occurred" >&2
Hvor ./ do_something utføres bare hvis cd-kommandoen (change directory) var «vellykket» (returnerte en utgangsstatus på null) og echo-kommandoen ville bare bli utført hvis enten cden eller ./ do_something kommandoen returnerer en «feil» (ikke-null utgangsstatus).
for alle kommandoer lagres utgangsstatusen i den spesielle variabelen $?
. Bash støtter ogsåhvis ...;deretter ...;annet ...; fi
og case $VARIABEL i $mønster)...;; $other_pattern)...;; esac
former for betinget kommandoevaluering.
Bug reportingEdit
en ekstern kommando kalt bashbug rapporterer Bash shell bugs. Når kommandoen påberopes, bringer den opp brukerens standardredigerer med et skjema for å fylle ut. Skjemaet er sendt Til Bash vedlikeholdere (eller eventuelt til andre e-postadresser).
Programmerbar completionEdit
Bash programmerbar fullføring,complete
ogcompgen
kommandoer har vært tilgjengelige siden betaversjonen av 2.04 i 2000. Disse fasilitetene tillater kompleks intelligent fullføring, for eksempel å tilby tabulatortilgjengelige tilgjengelige programalternativer, og deretter, etter at brukeren har valgt et alternativ som krever et filnavn som neste inngang, bare automatisk utfylling av filbaner (og ikke andre alternativer) for neste token.
Leave a Reply