Articles

Bash (Unix shell)

De Bash-opdrachtsyntaxis is een superset van de Bourne shell-opdrachtsyntaxis. Bash ondersteunt onder andere brace uitbreiding, command line completion (Programmable Completion), basic debugging en signal handling (gebruikmakend van trap) sinds bash 2.05 a. Bash kan de overgrote meerderheid van Bourne shell scripts uitvoeren zonder wijziging, met uitzondering van Bourne shell scripts struikelen in fringe syntaxis gedrag anders geïnterpreteerd in Bash of een poging om een systeem commando die overeenkomt met een nieuwere Bash builtin, enz. Bash-opdrachtsyntaxis bevat ideeën uit de KornShell (ksh) en de C shell (csh), zoals opdrachtregelbewerking, opdrachtgeschiedenis (history commando), de directorystack, de $RANDOM en $PPID variabelen, en POSIX-opdrachtsubstitutiesyntaxis $(…).

wanneer een gebruiker de tab-toets in een interactieve command-shell drukt, gebruikt Bash automatisch de commandoregelaanvulling, sinds beta Versie 2.04, om gedeeltelijk getypte programmanamen, bestandsnamen en variabelnamen te matchen. Het Bash command-line completion systeem is zeer flexibel en aanpasbaar, en is vaak verpakt met functies die argumenten en bestandsnamen voor specifieke programma ‘ s en taken te voltooien.

Bash ‘ s syntaxis heeft veel extensies die ontbreken in de Bourne shell. Bash kan integer berekeningen (“rekenkundige evaluatie”) uitvoeren zonder externe processen. Het gebruikt hiervoor de opdracht ((…)) en de variabele syntaxis $((…)). De syntaxis vereenvoudigt I / O omleiding. Het kan bijvoorbeeld standaarduitvoer (stdout) en standaardfout (stderr) tegelijkertijd omleiden met behulp van de &> operator. Dit is eenvoudiger te typen dan het Bourne shell equivalent ‘command > file 2>&1‘. Bash ondersteunt procesvervanging door gebruik te maken van de syntaxis <(command) en >(command), die de uitvoer van (of invoer naar) een commando vervangt waar normaal gesproken een bestandsnaam wordt gebruikt. (Dit wordt geïmplementeerd via/proc/ FD / unnamed pipes op systemen die dat ondersteunen, of via tijdelijke named pipes waar nodig).

wanneer het sleutelwoord ‘function’ wordt gebruikt, zijn Bash function declaraties niet compatibel met Bourne/Korn/POSIX scripts (de KornShell heeft hetzelfde probleem bij het gebruik van ‘function’), maar Bash accepteert dezelfde function declaratie syntaxis als de Bourne en Korn shells, en is POSIX-conform. Vanwege deze en andere verschillen zijn Bash shell-scripts zelden toepasbaar onder de Bourne of Korn shell-tolken, tenzij opzettelijk geschreven met die compatibiliteit in het achterhoofd, wat minder gebruikelijk wordt naarmate Linux meer verspreid wordt. Maar in POSIX-modus, Bash voldoet aan POSIX nauwer.

Bash ondersteunt hier documenten. Sinds Versie 2.05 b kan Bash standard input (stdin) omleiden van een “here string” met behulp van de <<< operator.

Bash 3.0 ondersteunt in-process reguliere expressie matching met behulp van een syntaxis die doet denken aan Perl.

In februari 2009 introduceerde Bash 4.0 ondersteuning voor associatieve arrays. Associatieve array indices zijn strings, op een manier vergelijkbaar met AWK of Tcl. Ze kunnen worden gebruikt om multidimensionale arrays te emuleren. Bash 4 schakelt ook zijn licentie naar GPLv3; sommige gebruikers vermoeden dat deze licentiewijziging de reden is waarom MacOS oudere versies blijft gebruiken. Apple stopte uiteindelijk met het gebruik van Bash in hun besturingssystemen met de release van MacOS Catalina in 2019.

Brace expansionEdit

Brace expansion, ook wel alternation genoemd, is een functie gekopieerd van de C shell. Het genereert een reeks alternatieve combinaties. Gegenereerde resultaten hoeven niet te bestaan als bestanden. De resultaten van elke uitgevouwen string worden niet gesorteerd en de volgorde van links naar rechts wordt bewaard:

$ 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

gebruikers moeten brace-uitbreidingen niet gebruiken in draagbare shell-scripts, omdat de Bourne-shell niet dezelfde uitvoer produceert.

$ # 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

wanneer brace-uitbreiding wordt gecombineerd met jokertekens, worden de accolades eerst uitgebreid en worden de resulterende jokertekens normaal vervangen. Vandaar dat een lijst van JPEG-en PNG-afbeeldingen in de huidige map kan worden verkregen met behulp van:

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.

naast afwisseling kan brace-uitbreiding worden gebruikt voor opeenvolgende bereiken tussen twee gehele getallen of tekens gescheiden door dubbele punten. Nieuwere versies van Bash staan een derde geheel getal toe om de increment te specificeren.

$ 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

wanneer brace expansie gecombineerd wordt met variabele expansie wordt de variabele expansie uitgevoerd na de brace expansie, wat in sommige gevallen het gebruik van de eval nodig kan maken, dus:

$ 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

Opstartscriptsedit

deze sectie bevat instructies, advies of how-to-inhoud. Het doel van Wikipedia is om feiten te presenteren, niet om te trainen. Help dit artikel te verbeteren door de how-to inhoud te herschrijven of door het te verplaatsen naar Wikiversity, Wikibooks of Wikivoyage. (Januari 2019)

wanneer Bash start, voert het de commando ‘ s uit in verschillende dot-bestanden. In tegenstelling tot Bash shell scripts hebben dot-bestanden meestal geen uitvoerrechten ingeschakeld, noch een interpreter-instructie zoals #!/bin/bash.

Legacy-compatible Bash startup exampledit

het skelet ~/.bash_profile hieronder is compatibel met de Bourne shell en geeft semantiek vergelijkbaar met csh voor de ~/.bashrc en ~/.bash_login. De && cmd is een kortsluitingsevaluatie die test of bestandsnaam bestaat en leesbaar is, waarbij het deel na de && wordt overgeslagen indien dit niet het geval is.

 && . ~/.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

problemen met besturingssystemen in Bash startupEdit

sommige versies van Unix en Linux bevatten Bash-systeemstartscripts, meestal onder de /etc mappen. Bash roept deze aan als onderdeel van de standaard initialisatie, maar andere opstartbestanden kunnen ze in een andere volgorde lezen dan de gedocumenteerde opstartvolgorde van Bash. De standaard inhoud van de bestanden van de root gebruiker kan ook problemen hebben, evenals het skelet bestanden die het systeem biedt aan nieuwe gebruikersaccounts bij het instellen. De opstartscripts die het X window systeem starten kunnen ook verrassende dingen doen met de Bash opstartscripts van de gebruiker in een poging om gebruikers-omgevingsvariabelen in te stellen voordat de window manager wordt gestart. Deze problemen kunnen vaak worden aangepakt met behulp van een ~/.xsession of ~/.xprofile bestand om de ~/.profile te lezen — die de omgevingsvariabelen levert die Bash-shell-windows uit de windowmanager nodig heeft, zoals xterm of Gnome Terminal.

PortabilityEdit

het aanroepen van Bash met de --posix optie of het aangeven van set -o posix in een script zorgt ervoor dat Bash zeer nauw voldoet aan de POSIX 1003.2 standaard. Bash shell scripts bedoeld voor portabiliteit moeten ten minste rekening houden met de POSIX shell standaard. Sommige bash functies niet gevonden in POSIX zijn:

  • bepaalde uitgebreide aanroepopties
  • Brace-uitbreiding
  • Arrays en associatieve arrays
  • de dubbele haakje ] extended test construct and its regex matching
  • de constructie met dubbele haakjes rekenkundige evaluatie (alleen (... )) ; $ (( ... )) is POSIX)
  • bepaalde stringmanipulatie operaties in parameteruitbreiding
  • local for scoped variables
  • proces substitutie
  • Bash-specifieke builtins
  • Coprocessen
  • $EPOCHSECONDS and $EPOCHREALTIME variables

als een stuk code een dergelijke functie gebruikt, wordt het een “bashism” genoemd-een probleem voor draagbaar gebruik. Debian ‘ s checkbashisms en Vidar Holen ‘ s shellcheck kunnen worden gebruikt om ervoor te zorgen dat een script deze delen niet bevat. De lijst varieert afhankelijk van de eigenlijke doel shell: Debian ‘ s beleid staat enkele uitbreidingen toe in hun scripts (zoals ze in dash), terwijl een script dat bedoeld is om pre-POSIX Bourne shells te ondersteunen, zoals autoconf ‘ s configure, nog beperkter zijn in de mogelijkheden die ze kunnen gebruiken.

sneltoetsbewerk

hoofdartikel: GNU Readline

Bash gebruikt readline om sneltoetsen aan te bieden voor het bewerken van de opdrachtregel met behulp van de standaard (Emacs) toetsenbindingen. Vi-bindingen kunnen worden ingeschakeld door set -o viuit te voeren.

Process managementEdit

De Bash shell heeft twee uitvoermodi voor commando ‘ s: batch en gelijktijdige modus.

om opdrachten in batch (dat wil zeggen in volgorde) uit te voeren, moeten ze gescheiden worden door het teken “;”, of op aparte regels:

command1; command2

in dit voorbeeld, wanneer command1 klaar is, wordt command2 uitgevoerd.

een background uitvoering van command1 kan plaatsvinden met behulp van (symbool &) aan het einde van een execution commando, en proces zal worden uitgevoerd in background terug te keren onmiddellijk controle naar de shell en het toestaan van verdere uitvoering van commando ‘ s.

command1 &

of om een gelijktijdige uitvoering van twee command1 en command2 te hebben, moeten ze op de volgende manier in de Bash shell worden uitgevoerd:

command1 & command2

in dit geval wordt command1 uitgevoerd op de achtergrond & symbool, waarbij onmiddellijk controle wordt teruggegeven aan de shell die command2 op de voorgrond uitvoert.

een proces kan worden gestopt en de besturing kan worden teruggegeven aan bash door Ctrl+z te typen terwijl het proces op de voorgrond draait.

een lijst van alle processen, zowel op de achtergrond als gestopt, kan worden bereikt door jobs:

$ jobs- Running command1 &+ Stopped command2

In de uitvoer uit te voeren, het nummer tussen haakjes verwijst naar de taak-id. Het plusteken betekent het standaardproces voor bg en fg. De tekst ” Running “en” Stopped ” verwijzen naar de processtatus. De laatste string is het commando dat het proces startte.

de status van een proces kan worden gewijzigd met behulp van verschillende commando ‘ s. Het commando fg brengt een proces naar de voorgrond, terwijl bg Een gestopt proces instelt dat op de achtergrond draait. bg en fg kunnen een taak-id als hun eerste argument nemen, om het proces te specificeren waarop moet worden gereageerd. Zonder een, gebruiken ze het standaard proces, geïdentificeerd door een plusteken in de uitvoer van jobs. Het kill commando kan gebruikt worden om een proces voortijdig te beëindigen door het een signaal te sturen. Het taak-id moet worden opgegeven na een procentteken:

kill %1

Conditional executionEdit

Bash levert “conditional execution” opdrachtscheidingstekens die de uitvoering van een opdracht afhankelijk maken van de exit code die is ingesteld door een precedent Commando. Bijvoorbeeld:

cd "$SOMEWHERE" && ./do_something || echo "An error occurred" >&2

waar ./ do_something wordt alleen uitgevoerd als het cd (change directory) commando “succesvol” was (gaf een exit status van nul) en het echo commando zou alleen worden uitgevoerd als ofwel de cd of de ./ do_something Commando retourneer een “fout” (niet-nul exit status).

voor alle opdrachten wordt de afsluitstatus opgeslagen in de speciale variabele $?. Bash ondersteunt ook if ...;dan ...;anders ...; fi en case $ VARIABLE in $pattern)...;; $other_pattern)...;; esac forms of conditional command evaluation.

Bug reportagedit

“bashbug” redirects here. Voor de algemeen gerapporteerde september 2014 bug gevonden in Bash, zie Shellshock (software bug).

een extern commando genaamd bashbug rapporteert Bash shell bugs. Wanneer de opdracht wordt aangeroepen, verschijnt de standaard editor van de gebruiker met een formulier om in te vullen. Het formulier wordt gemaild naar de beheerders van Bash (of eventueel naar andere e-mailadressen).

Programmable completionEdit

Bash programmable completion, complete en compgen commando ‘ s zijn beschikbaar sinds de bètaversie van 2.04 in 2000. Deze faciliteiten zorgen voor complexe intelligente voltooiing, zoals het aanbieden van tab-complete beschikbare programma-opties en vervolgens, nadat de gebruiker een optie selecteert die een bestandsnaam als de volgende invoer vereist, alleen automatisch aanvullen bestandspaden (en niet andere opties) voor de volgende token.