Hva er forskjellen mellom å bruke bash og sh for å kjøre et skript?

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

  • @Pandya $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.
  • @jlliagre oh! ok. wiki.debian.org sier " SHELL = Nåværende skall. "
  • @Pandya skal det faktisk si " Brukeren ' s påloggingsskall ". Det nåværende skallet kan være annerledes.

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 at sh er en symbolsk lenke til dash i stedet for bash. 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 og dash?
  • Begge bruker Bourne shell-syntaksen. Som jeg skrev i svaret mitt, er dash en ren implementering av POSIX-skallstandarden. På den annen side er bash et skall med ganske stort antall utvidelser og ikke-standardfunksjoner, noen inspirert av ksh, 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 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *