Utfører bash og sh et skript annerledes? Jeg utførte et skallskript med både bash og sh, og fikk samme utdata. Så hva er forskjellen?
Bruker den også bash eller sh når du bare kjører ./executable
?
Kommentarer
Svar
Det avhenger av systemet du kjører. Én mange operativsystemer, spesielt Linux-baserte, sh
er en lenke til bash
.
I slike tilfeller er det er fremdeles noen forskjeller i atferd der bash
prøver å være mer som et tradisjonelt bourne-skall når det heter sh
, men det aksepterer fortsatt de fleste bashismer.
På noen andre operativsystemer, som Debian-baserte, er sh
levert av dash
, ikke bash
. Det gjør en mye større forskjell da dash
ikke støtter bashismer, og er designet for å være en ren implementering av POSIX-skall.
På proprietære operativsystemer, sh
er ofte enten levert av en POSIX-kompatibel ksh88
som i likhet med dash
, ikke implementerer basisme. Avhengig av hva din PATH er på Solaris 10 og eldre, vil sh
sannsynligvis være et eldre Bourne-skall, som går foran POSIX.
I alle fall har du sannsynligvis den samme utgangen med testen din rett og slett fordi skriptet ditt ikke brukte noen bash
spesifikk kommando, alternativ eller syntaks.
Når du kjører ./executable
, hvilket skall som skal kjøres, avhenger egentlig av shebang skrevet i begynnelsen av .executable script. Det vil være bash
hvis shebang spesifiserer det:
#!/bin/bash ....
Hvis det ikke er noen shebang og du kaller skriptet fra et POSIX-kompatibelt skall, skal skriptet teknisk utføres av den første sh
som finnes i PATH. Mange skalltolk som bash
, dash
og ksh
anser seg selv for å være POSIX, så vil også tolke manuset. Merk at miljøvariabelen SHELL
ikke brukes her.
Kommentarer
- Jeg så meg rundt i
/bin
og jeg fant atsh
er en symbolsk lenke tildash
i stedet forbash
. Så hvordan kjørte de det samme? Den ' kjørte egentlig ikke noen bash-skriptkommandoer, bare terminalkommandoer for å bruke andre pakker ' verktøy. - Hvis skallskriptet ditt bare ringer andre kommandoer sekvensielt, vil hvilken som helst skalltolk kjøre det med samme resultat. Ingenting uventet her.
- Dette er ikke ' t relatert til spørsmålet, men hva er egentlig forskjellen mellom
bash
ogdash
? - Begge bruker Bourne shell-syntaksen. Som jeg skrev i svaret mitt, er
dash
en ren implementering av POSIX-skallstandarden. På den annen side erbash
et skall med ganske stort antall utvidelser og ikke-standardfunksjoner, noen inspirert avksh
,ksh93
og andre skjell, og noen bash-spesifikke, kjent som bashismer. Det er et verktøy som heter checkbashisms som hjelper til med å identifisere alt som ikke er strengt bærbart i et gitt skallskript.
Svar
Ja det kan være, men det trenger ikke være. De to skjellene er ikke de samme, men det grunnleggende er kompatibelt. Sjekk dette innlegget for mer informasjon.
Du kan bruke følgende linje i et skript for å sjekke tolken som brukes:
ps h -p $$ -o args="" | cut -f1 -d" "
Du kan eksplisitt spesifisere skallet som skal brukes når skriptet kjøres direkte med sheebang
-linjen:
#!/bin/sh
eller
#!/bin/bash
$SHELL
-variabelen brukes ikke til å bestemme hvilket skall som skal tolke./executable
manus. Det ' forteller ikke nødvendigvis hva det nåværende skallet er heller.