Bash (Unix shell)
bash-kommandosyntaxen är en superset av Bourne shell-kommandosyntaxen. Bash stöder brace expansion, kommandoradskomplettering (programmerbar slutförande), grundläggande felsökning och signalhantering (med trap
) sedan bash 2.05 a bland andra funktioner. Bash kan köra de allra flesta Bourne shell-skript utan modifiering, med undantag för Bourne shell-skript som snubblar in i franssyntaxbeteende tolkas annorlunda i Bash eller försöker köra ett systemkommando som matchar en nyare Bash inbyggd, etc. Bash kommando syntax innehåller ideer dras från KornShell (ksh) och C skal (csh) såsom kommandoraden redigering, kommandohistorik (history
kommandot), katalogstacken, $RANDOM
och $PPID
variabler, och POSIX kommando substitution syntax $(…)
.
När en användare trycker på tab-tangenten i ett interaktivt kommandoskal använder Bash automatiskt kommandoradskomplettering, sedan betaversion 2.04, för att matcha delvis skrivna programnamn, filnamn och variabelnamn. Bash-kommandoradskompletteringssystemet är mycket flexibelt och anpassningsbart och är ofta förpackat med funktioner som kompletterar argument och filnamn för specifika program och uppgifter.
Bashs syntax har många tillägg som saknas i Bourne-skalet. Bash kan utföra heltalsberäkningar (”aritmetisk utvärdering”) utan att leka externa processer. Den använder kommandot ((…))
och $((…))
variabel syntax för detta ändamål. Dess syntax förenklar I / O omdirigering. Det kan till exempel omdirigera standardutgång (stdout) och standardfel (stderr) samtidigt med &>
operatör. Detta är enklare att skriva än Bourne shell-ekvivalenten ’command > file 2>&1
’. Bash stöder processersättning med<(command)
och>(command)
syntax, som ersätter utmatningen av (eller inmatningen till) ett kommando där ett filnamn normalt används. (Detta implementeras genom/proc/ fd / icke namngivna rör på system som stöder det, eller via tillfälliga namngivna rör vid behov).
När du använder nyckelordet ’funktion’ är Bash-funktionsdeklarationer inte kompatibla med Bourne/Korn/POSIX-skript (KornShell har samma problem när du använder ’funktion’), men Bash accepterar samma funktionsdeklarationssyntax som Bourne-och Korn-skalen och är POSIX-överensstämmande. På grund av dessa och andra skillnader kan Bash shell-skript sällan köras under Bourne-eller Korn-skaltolkarna såvida de inte medvetet skrivs med den kompatibiliteten i åtanke, vilket blir mindre vanligt när Linux blir mer utbredd. Men i POSIX-läge överensstämmer Bash med POSIX närmare.
Bash stöder här dokument. Sedan version 2.05 B Bash kan omdirigera standardinmatning (stdin) från en ”här sträng” med <<<
operatör.
Bash 3.0 stöder in-process reguljära uttryck matchning med hjälp av en syntax som påminner om Perl.
i februari 2009 introducerade Bash 4.0 stöd för associativa arrayer. Associativa arrayindex är strängar, på ett sätt som liknar AWK eller Tcl. De kan användas för att emulera flerdimensionella arrays. Bash 4 byter också sin licens till GPLv3; vissa användare misstänker att denna licensändring är varför MacOS fortsätter att använda äldre versioner. Apple slutade äntligen använda Bash i sina operativsystem med lanseringen av MacOS Catalina 2019.
Brace expansionEdit
Brace expansion, även kallad alternation, är en funktion kopierad från C-skalet. Det genererar en uppsättning alternativa kombinationer. Genererade resultat behöver inte existera som filer. Resultaten av varje expanderad sträng sorteras inte och vänster till höger ordning bevaras:
$ 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
användare bör inte använda stagutvidgningar i bärbara skalskript, eftersom Bourne-skalet inte producerar samma utgång.
$ # 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 stagutvidgning kombineras med jokertecken expanderas hängslen först och sedan ersätts de resulterande jokertecknen normalt. Därför kan en lista över JPEG-och PNG-bilder i den aktuella katalogen erhållas med:
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.
förutom växling kan stagutvidgning användas för sekventiella intervall mellan två heltal eller tecken separerade med dubbla prickar. Nyare versioner av Bash tillåter ett tredje heltal att ange inkrementet.
$ 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 stagutvidgning kombineras med variabel expansion utförs variabel expansion efter stagutvidgningen, vilket i vissa fall kan kräva användning av eval
inbyggd, sålunda:
$ 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 startar kör den kommandona i en mängd olika punktfiler. Till skillnad från Bash-skalskript har dot-filer vanligtvis inte exekverat tillstånd aktiverat eller ett tolkdirektiv som #!/bin/bash
.
Legacy-kompatibel bash startup exampleEdit
skelettet~/.bash_profile
nedan är kompatibelt med Bourne-skalet och ger semantik som liknar csh för~/.bashrc
och~/.bash_login
&& cmd
är en kortslutningsutvärdering som testar om filnamnet finns och är läsbart och hoppar över delen efter &&
om det inte är 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
operativsystemproblem i Bash startupEdit
vissa versioner av Unix och Linux innehåller bash-systemstartskript, vanligtvis under/etc
kataloger. Bash kallar dessa som en del av sin standardinitialisering, men andra startfiler kan läsa dem i en annan ordning än den dokumenterade Bash-startsekvensen. Standardinnehållet i rotanvändarens filer kan också ha problem, liksom skelettfilerna som systemet tillhandahåller till nya användarkonton vid installationen. Startskript som startar X window-systemet kan också göra överraskande saker med användarens Bash-startskript i ett försök att ställa in användarmiljövariabler innan du startar fönsterhanteraren. Dessa problem kan ofta åtgärdas med hjälp av en~/.xsession
eller~/.xprofile
fil för att läsa~/.profile
— som ger de miljövariabler som Bash shell windows skapade från fönsterhanteraren behöver, till exempel xterm eller Gnome Terminal.
PortabilityEdit
anropa Bash med alternativet --posix
eller ange set -o posix
I ett skript får Bash att överensstämma mycket nära POSIX 1003.2-standarden. Bash shell-skript avsedda för bärbarhet bör ta hänsyn till åtminstone POSIX shell-standarden. Vissa bash-funktioner som inte finns i POSIX är:
- vissa utökade anropsalternativ
- Brace expansion
- Arrays och associativa arrays
- dubbelfästet
]
extended test construct och dess regex-matchning - de dubbla parenteserna aritmetiska utvärderingskonstruktionen (endast
(( ... )) ;
$ ((... )) är POSIX)
- vissa strängmanipulationsoperationer i parameterutvidgning
-
lokal för scoped variabler
- processersättning
- Bash-specifika builtins
- Coprocesser
- $EPOCHSECONDS och $EPOCHREALTIME variabler
om en kod använder en sådan funktion kallas den en ”bashism”-ett problem för bärbar användning. Debianscheckbashisms
och Vidar Holensshellcheck
kan användas för att se till att ett skript inte innehåller dessa delar. Listan varierar beroende på det faktiska målskalet: Debians policy tillåter vissa tillägg i sina skript (som de är i dash
), medan ett skript som avser att stödja Pre-POSIX Bourne-skal, som autoconfs konfigurera
, är ännu mer begränsade i de funktioner de kan använda.
Tangentbordsgenvägredigera
Bash använder readline för att tillhandahålla kortkommandon för kommandoradsredigering med standard (Emacs) tangentbindningar. Vi-bindningar kan aktiveras genom att köra set -o vi
.
process managementEdit
Bash-skalet har två körningssätt för kommandon: batch och samtidig läge.
för att utföra kommandon i batch (dvs. i följd) måste de separeras med tecknet”;”eller på separata rader:
command1; command2
i det här exemplet, när command1 är klar, exekveras command2.
en bakgrundsexekvering av kommando1 kan inträffa med (symbol &) I slutet av ett exekveringskommando, och processen kommer att utföras i bakgrunden som omedelbart återgår kontrollen till skalet och tillåter fortsatt körning av kommandon.
command1 &
eller för att ha en samtidig körning av två kommando1 och kommando2 måste de utföras i Bash-skalet på följande sätt:
command1 & command2
i detta fall command1 körs i bakgrunden& symbol, återvänder omedelbart kontroll till skalet som kör command2 i förgrunden.
en process kan stoppas och kontrollen returneras till bash genom att skriva Ctrl+z medan processen körs i förgrunden.
en lista över alla processer, både i bakgrunden och stoppad, kan uppnås genom att köra jobs
:
$ jobs- Running command1 &+ Stopped command2
i utgången hänvisar numret inom parentes till jobb-id. Plustecknet betyder standardprocessen för bg
och fg
. Texten ”Running” och ”stoppad” hänvisar till Processtillståndet. Den sista strängen är kommandot som startade processen.
tillståndet för en process kan ändras med olika kommandon. Kommandotfg
ger en process i förgrunden, medanbg
ställer in en stoppad process som körs i bakgrunden. bg
och fg
kan ta ett jobb-id som sitt första argument för att ange processen att agera på. Utan en använder de standardprocessen, identifierad med ett plustecken i utmatningen av jobs
. Kommandotkill
kan användas för att avsluta en process i förtid genom att skicka en signal. Jobb-id måste anges efter ett procenttecken:
kill %1
Conditional executionEdit
Bash levererar ”conditional execution” kommandoseparatorer som gör utförandet av ett kommando beroende av exit-koden som ställts in av ett prejudikatkommando. Till exempel:
cd "$SOMEWHERE" && ./do_something || echo "An error occurred" >&2
var ./ do_something körs bara om kommandot cd (change directory) var ”framgångsrikt” (returnerade en utgångsstatus på noll) och echo-kommandot skulle bara utföras om antingen cd-skivan eller ./ do_something-kommandot returnerar ett ” fel ” (status som inte är noll).
för alla kommandon lagras utgångsstatusen i specialvariabeln $?
. Bash stöder också if ...;sedan ...;annat ...; fi
och case $variabel i $mönster)...;; $ other_pattern)...;; ESAC
former av villkorlig kommandoutvärdering.
Felrapporteringredigera
ett externt kommando som heter bashbug rapporterar Bash shell bugs. När kommandot anropas tar det upp användarens standardredigerare med ett formulär att fylla i. Formuläret skickas till Bash-underhållarna (eller eventuellt till andra e-postadresser).
programmerbar kompletteringedit
bash programmerbar komplettering,complete
ochcompgen
kommandon har varit tillgängliga sedan betaversionen av 2.04 år 2000. Dessa faciliteter tillåter komplex intelligent slutförande, till exempel att erbjuda tab-complete tillgängliga programalternativ och sedan, efter att användaren väljer ett alternativ som kräver ett filnamn som nästa inmatning, endast automatisk komplettering av filvägar (och inte andra alternativ) för nästa token.
Leave a Reply