Bash (unik shell)
Bash-kommandosyntaksen er et supersæt af Bourne shell-kommandosyntaksen. Bash understøtter brace ekspansion, kommandolinje færdiggørelse (programmerbar færdiggørelse), grundlæggende debugging og signalhåndtering (ved hjælp af trap
) siden bash 2.05 a blandt andre funktioner. Bash kan udføre langt størstedelen af Bourne shell-scripts uden ændring, med undtagelse af Bourne shell-scripts, der snubler ind i frynssyntaksadfærd fortolket forskelligt i Bash eller forsøger at køre en systemkommando, der matcher en nyere bash-indbygget, etc. Bash kommando syntaks indeholder ideer trukket fra KornShell (ksh) og C shell (csh) såsom kommandolinjeredigering, kommandohistorik (history
kommando), katalogstakken, $RANDOM
og $PPID
variabler og position kommandosubstitution syntaks $(…)
.
Når en bruger trykker på tab-tasten i en interaktiv kommando-shell, Bash bruger automatisk kommandolinjen færdiggørelse, siden beta version 2.04, til at matche delvist indtastede programnavne, filnavne og variabelnavne. Bash-kommandolinjens færdiggørelsessystem er meget fleksibelt og kan tilpasses og er ofte pakket med funktioner, der fuldender argumenter og filnavne til specifikke programmer og opgaver.Bashs syntaks har mange udvidelser, der mangler i Bourne-skallen. Bash kan udføre heltalsberegninger (“aritmetisk evaluering”) uden at gyde eksterne processer. Det bruger ((…))
kommandoen og $((…))
variabel syntaks til dette formål. Dens syntaks forenkler i / O omdirigering. For eksempel kan den omdirigere standardoutput (stdout) og standardfejl (stderr) på samme tid ved hjælp af &>
operatør. Dette er enklere at skrive end Bourne-skalækvivalenten ‘command > file 2>&1
‘. Bash understøtter proces substitution ved hjælp af<(command)
og>(command)
syntaks, som erstatter output af (eller input til) en kommando, hvor et filnavn normalt bruges. (Dette implementeres gennem / proc/ fd / unavngivne rør på systemer, der understøtter det, eller via midlertidige navngivne rør, hvor det er nødvendigt).
Når du bruger nøgleordet ‘funktion’, er Bash-funktionsdeklarationer ikke kompatible med Bourne/Korn/Posis scripts (KornShell har det samme problem, når du bruger ‘funktion’), men Bash accepterer den samme funktionsdeklarationssyntaks som Bourne-og Kornskallerne og er Posis-konform. På grund af disse og andre forskelle, Bash shell-scripts kan sjældent køres under Bourne-eller Korn-shell-tolkene, medmindre de bevidst er skrevet med den kompatibilitet i tankerne, hvilket bliver mindre almindeligt, efterhånden som Linuk bliver mere udbredt. Men i position tilstand, Bash er i overensstemmelse med position nærmere.Bash understøtter her dokumenter. DA version 2.05 B Bash kan omdirigere standard input (stdin) fra en “her streng” ved hjælp af <<<
operatør.
Bash 3.0 understøtter regelmæssig ekspressionstilpasning i processen ved hjælp af en syntaks, der minder om Perl.
i februar 2009 introducerede Bash 4.0 støtte til associative arrays. Associative array-indekser er strenge på en måde, der ligner AK eller Tcl. De kan bruges til at efterligne multidimensionelle arrays. Bash 4 skifter også sin licens til GPLv3; nogle brugere har mistanke om, at denne licensændring er grunden til, at MacOS fortsætter med at bruge ældre versioner. Apple stoppede endelig med at bruge Bash i deres operativsystemer med udgivelsen af MacOS Catalina i 2019.
Brace ekspansionredit
Brace ekspansion, også kaldet vekslen, er en funktion kopieret fra C shell. Det genererer et sæt alternative kombinationer. Genererede resultater behøver ikke at eksistere som filer. Resultaterne af hver udvidet streng er ikke sorteret og venstre til højre rækkefølge bevares:
$ 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
brugere bør ikke bruge brace-udvidelser i bærbare shell-scripts, fordi Bourne-skallen ikke producerer den samme output.
$ # 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-udvidelse kombineres med jokertegn, udvides seler først, og derefter erstattes de resulterende jokertegn normalt. Derfor kunne en liste over JPEG-og PNG-billeder i den aktuelle mappe opnås ved hjælp af:
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.
ud over veksling kan brace-udvidelse bruges til sekventielle intervaller mellem to heltal eller tegn adskilt med dobbelt prikker. Nyere versioner af Bash tillader et tredje heltal at specificere stigningen.
$ 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 brace-ekspansion kombineres med variabel ekspansion, udføres den variable ekspansion efter brace-udvidelsen, hvilket i nogle tilfælde kan nødvendiggøre brugen afeval
indbygget, således at den:
$ 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, udfører den kommandoerne i en række dot-filer. I modsætning til Bash shell-scripts har dot-filer typisk ikke aktiveret eksekveringstilladelse eller et tolkedirektiv som #!/bin/bash
.
Legacy-kompatibel Bash startup eksempelredit
skelettet~/.bash_profile
nedenfor er kompatibel med Bourne shell og giver semantik svarende til csh for~/.bashrc
og~/.bash_login
&& cmd
er en kortslutningsevaluering, der tester, om filnavnet findes og kan læses, og springer over delen efter &&
hvis det ikke er tilfældet.
&& . ~/.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
nogle versioner af Bash system startup scripts, generelt under/etc
mapper. Bash kalder disse som en del af sin standard initialisering, men andre startfiler kan læse dem i en anden rækkefølge end den dokumenterede Bash startsekvens. Standardindholdet i rodbrugerens filer kan også have problemer, såvel som de skeletfiler, systemet leverer til nye brugerkonti ved opsætning. Start scripts, der starter vinduet systemet kan også gøre overraskende ting med brugerens Bash startup scripts i et forsøg på at oprette bruger-miljø variabler, før du starter vinduet manager. Disse problemer kan ofte løses ved hjælp af en~/.xsession
eller~/.xprofile
— fil for at læse~/.profile
– som giver de miljøvariabler, som Bash shell-vinduer skabte fra vinduesadministratoren, har brug for, f.eks.
PortabilityEdit
påberåbelse af Bash med--posix
eller angivelse afset -o posix
i et script får Bash til at tilpasse sig meget tæt til position 1003.2-standarden. Bash shell-scripts, der er beregnet til bærbarhed, skal i det mindste tage højde for Shell-standarden. Nogle bash-funktioner, der ikke findes i position, er:
- visse udvidede påkaldelsesmuligheder
- Brace ekspansion
- Arrays og associative arrays
- dobbeltbeslaget
] udvidet testkonstruktion og dens regeks matching
- dobbeltparenteserne aritmetisk evalueringskonstruktion (kun
(( ... )) ;
$ ((... visse strengmanipulationsoperationer i parameterudvidelse
-
lokal for scopedvariabler
- process substitution
- Bash-specifikke builtins
- Coprocesses
- $EPOCHSECONDS and $EPOCHREALTIME variables
Hvis et stykke kode bruger en sådan funktion, kaldes det en “bashism”-et problem til bærbar brug. Debians checkbashisms
og Vidar Holens shellcheck
kan bruges til at sikre, at et script ikke indeholder disse dele. Listen varierer afhængigt af den faktiske målskal: Debians politik tillader nogle udvidelser i deres scripts (som de er i dash
), mens et script, der har til hensigt at understøtte Pre-position Bourne-skaller, som autoconfs Konfigurer
, er endnu mere begrænset i de funktioner, de kan bruge.
Tastaturgenvejrediger
Bash bruger readline til at levere tastaturgenveje til kommandolinjeredigering ved hjælp af standard (Emacs) tastebindinger. Vi-bindinger kan aktiveres ved at køre set -o vi
.
Process managementEdit
Bash-skallen har to udførelsesformer for kommandoer: batch og samtidig tilstand.
for at udføre kommandoer i batch (dvs. i rækkefølge) skal de adskilles af tegnet”; ” eller på separate linjer:
command1; command2
i dette eksempel, når command1 er færdig, udføres command2.
en baggrundsudførelse af command1 kan forekomme ved hjælp af (symbol&) i slutningen af en eksekveringskommando, og processen udføres i baggrunden, der straks vender tilbage til skallen og tillader fortsat udførelse af kommandoer.
command1 &
eller for at have en samtidig udførelse af to kommando1 og kommando2, skal de udføres i Bash-skallen på følgende måde:
command1 & command2
i dette tilfælde udføres kommando1 i baggrunden& symbol, der straks vender tilbage til den skal, der udfører kommando2 i forgrunden.
en proces kan stoppes og kontrol returneres til bash ved at skrive Ctrl+å, mens processen kører i forgrunden.
en liste over alle processer, både i baggrunden og stoppet, kan opnås ved at kørejobs
:
$ jobs- Running command1 &+ Stopped command2
i output refererer nummeret i parentes til job-id ‘ et. Plustegnet betyder standardprocessen for bg
og fg
. Teksten “kører” og “stoppet” henviser til Procestilstanden. Den sidste streng er den kommando, der startede processen.
tilstanden for en proces kan ændres ved hjælp af forskellige kommandoer. Kommandoenfg
bringer en proces i forgrunden, mensbg
indstiller en stoppet proces, der kører i baggrunden. bg
og fg
kan tage et job-id som deres første argument for at specificere processen at handle på. Uden en bruger de standardprocessen, identificeret med et plustegn i output af jobs
. Kommandoenkill
kan bruges til at afslutte en proces for tidligt ved at sende det et signal. Job-id ‘ et skal angives efter et procenttegn:
kill %1
betinget eksekveringedit
Bash leverer kommandoseparatorer til “betinget eksekvering”, der gør udførelse af en kommando betinget af den udgangskode, der er indstillet af en præcedens-kommando. For eksempel:
cd "$SOMEWHERE" && ./do_something || echo "An error occurred" >&2
hvor ./ do_something udføres kun, hvis kommandoen cd (change directory) var “vellykket” (returnerede en udgangsstatus på nul), og echo-kommandoen ville kun blive udført, hvis enten cd ‘ en eller ./ do_something kommando returnere en” fejl ” (ikke-nul udgangsstatus).
for alle kommandoer gemmes udgangsstatus i den specielle variabel$?
. Bash understøtter også hvis ...;derefter ...;andet ...; fi
og sag $variabel i $mønster)...;; $ other_pattern)...;; esac former for betinget kommandovurdering.
Fejlrapporteringrediger
en ekstern kommando kaldet bashbug rapporterer Bash shell bugs. Når kommandoen påberåbes, bringer den brugerens standardeditor op med en formular, der skal udfyldes. Formularen sendes til Bash-vedligeholderne (eller eventuelt til andre e-mail-adresser).
programmerbar færdiggørelsedit
Bash programmerbar færdiggørelse,complete
ogcompgen
kommandoer har været tilgængelige siden betaversionen af 2.04 i 2000. Disse faciliteter tillader kompleks intelligent færdiggørelse, såsom at tilbyde at fuldføre tilgængelige programindstillinger, og derefter, efter at brugeren har valgt en indstilling, der kræver et filnavn som dets næste input, kun automatisk udfyldelse af filstier (og ikke andre muligheder) til det næste token.
Leave a Reply