Hvad er forskellen mellem at bruge bash og sh til at køre et script?

Udfører bash og sh et script forskelligt? Jeg udførte et shell-script med både bash og sh og fik den samme output. Så hvad er forskellen?

Også når du bare kører ./executable, bruger den bash eller sh?

Kommentarer

  • @Pandya $SHELL variablen bruges ikke til at bestemme, hvilken shell der skal fortolke ./executable manuskript. Det ' fortæller ikke nødvendigvis, hvad den aktuelle skal er.
  • @jlliagre åh! Okay. wiki.debian.org siger " SHELL = Den aktuelle skal. "
  • @Pandya skal det faktisk sige " Brugeren ' s login shell ". Den aktuelle shell kan være anderledes.

Svar

Det afhænger af det system, du kører. Én mange operativsystemer, især Linux-baserede, sh er et link til bash.

I et sådant tilfælde er der er stadig nogle forskelle i adfærd, hvor bash forsøger at være mere som traditionel bourne shell, når den kaldes sh, men den accepterer stadig de fleste bashismer.

På nogle andre operativsystemer, som Debian-baserede, leveres sh af dash, ikke bash. Det gør en meget større forskel, da dash understøtter ikke bashismer, idet de er designet til at være en ren implementering af POSIX-shell.

På proprietære OSer sh leveres ofte enten af en POSIX-kompatibel ksh88 som ligesom dash ikke implementerer bashismer. Afhængigt af hvad din PATH er, vil sh på Solaris 10 og ældre sandsynligvis være en ældre Bourne-skal, der går forud for POSIX.

Under alle omstændigheder har du sandsynligvis den samme output med din test simpelthen fordi dit script ikke brugte nogen bash specifik kommando, mulighed eller syntaks.

Når du kører ./executable, hvilken shell der køres, afhænger i det væsentlige af shebang skrevet i begyndelsen af .executable script. Det vil være bash hvis shebang angiver det:

#!/bin/bash .... 

Hvis der ikke er nogen shebang, og du kalder scriptet fra en POSIX-kompatibel shell skal scriptet teknisk udføres af den første sh, der findes i PATH. Mange shell-tolke som bash, dash og ksh betragter sig selv som POSIX, så det vil fortolke manuskriptet. Bemærk, at SHELL miljøvariablen ikke bruges her.

Kommentarer

  • Jeg kiggede rundt i /bin og jeg fandt ud af, at sh er et symbolsk link til dash snarere end bash. Så hvordan kørte de det samme? Det kørte ' ikke rigtig nogen bash-script-kommandoer, bare terminalkommandoer for at bruge andre pakker ' -værktøjer.
  • Hvis dit shell-script bare fortløbende ringer til andre kommandoer, vil enhver shell-tolk køre det med det samme resultat. Intet uventet her.
  • Dette er ikke ' t relateret til spørgsmålet, men hvad er præcis forskellen mellem bash og dash?
  • Begge bruger Bourne-shell-syntaksen. Som jeg skrev i mit svar er dash en ren implementering af POSIX-skalstandarden. På den anden side er bash en skal med et stort antal udvidelser og ikke-standardfunktioner, nogle inspireret af ksh, ksh93 og andre skaller og nogle bash-specifikke, kendt som bashismer. Der er et værktøj, der hedder checkbashisms, der hjælper med at identificere alt, hvad der ikke er strengt bærbart i et givet shell-script.

Svar

Ja det kunne være, men det behøver ikke være. De to skaller er ikke de samme, men det grundlæggende er kompatibelt. Se dette indlæg for flere detaljer.

Du kan bruge følgende linje i et script til at kontrollere den tolk, der bruges:

ps h -p $$ -o args="" | cut -f1 -d" " 

Du kan eksplicit angive den shell, der skal bruges, når scriptet udføres direkte med sheebang -linjen:

#!/bin/sh 

eller

#!/bin/bash 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *