Voert bash en sh een script op een andere manier uit? Ik heb een shell-script uitgevoerd met zowel bash als sh, en kreeg dezelfde uitvoer. Dus wat is het verschil?
Als je net ./executable
uitvoert, wordt dan bash of sh gebruikt?
Reacties
Answer
Dat hangt af van het systeem dat je gebruikt. In een groot aantal besturingssystemen, vooral op Linux gebaseerde, is sh
een link naar bash
.
In dat geval is er zijn nog steeds enkele verschillen in gedrag waarbij bash
meer op traditionele bourne-shell lijkt wanneer sh
wordt genoemd, maar het accepteert nog steeds de meeste bashismen.
Op sommige andere besturingssystemen, zoals op Debian gebaseerde, wordt sh
geleverd door dash
, niet door bash
. Dat maakt een veel groter verschil aangezien dash
geen bashisms ondersteunt, omdat het is ontworpen als een schone POSIX-shell-implementatie.
Op propriëtaire besturingssystemen, sh
wordt vaak geleverd door een POSIX-compatibele ksh88
die, net als dash
, geen bashisms implementeert. Op Solaris 10 en ouder, afhankelijk van wat uw PATH is, sh
zal waarschijnlijk een oudere Bourne-shell zijn, ouder dan POSIX.
In elk geval heb je waarschijnlijk dezelfde uitvoer met uw test simpelweg omdat uw script geen bash
specifiek commando, optie of syntaxis gebruikte.
Wanneer u , welke shell zal worden uitgevoerd, hangt in wezen af van de shebang die aan het begin van het .executable script is geschreven. Dat is bash
als de shebang het specificeert:
#!/bin/bash ....
Als er geen shebang is en je roept het script vanuit een POSIX-compatibele shell, zou het script technisch moeten worden uitgevoerd door de eerste sh
die in het PATH is gevonden. Veel shell-interpreters zoals bash
, dash
en ksh
beschouwen zichzelf als POSIX en dat zal ook gebeuren interpreteer het script. Merk op dat de SHELL
omgevingsvariabele hier niet wordt gebruikt.
Reacties
- Ik keek rond in
/bin
en ik ontdekte datsh
een symbolische link is naardash
in plaats vanbash
. Dus hoe liepen ze hetzelfde? Het was niet ' t echt om bash-scriptopdrachten uit te voeren, alleen terminalopdrachten om andere pakketten te gebruiken ' tools. - Als je shellscript alleen opeenvolgend andere commandos aanroept, zal elke shell-interpreter het uitvoeren met hetzelfde resultaat. Niets onverwachts hier.
- Dit is niet ' t gerelateerd aan de vraag, maar wat is precies het verschil tussen
bash
endash
? - Beide gebruiken de Bourne shell-syntaxis. Zoals ik in mijn antwoord schreef, is
dash
een schone implementatie van de POSIX-shell-standaard. Aan de andere kant isbash
een shell met een behoorlijk groot aantal extensies en niet-standaardfuncties, sommige geïnspireerd doorksh
,ksh93
en andere shells, en sommige bash-specifieke, bekend als bashisms. Er is een tool genaamd checkbashisms die helpt bij het identificeren van alles dat niet strikt draagbaar is in een bepaald shellscript.
Answer
Ja dat zou kunnen, maar het hoeft niet zo te zijn. De twee schalen zijn niet hetzelfde, maar de basis is compatibel. Controleer dit bericht voor meer details.
U kunt de volgende regel in een script gebruiken om de gebruikte tolk te controleren:
ps h -p $$ -o args="" | cut -f1 -d" "
Je kunt expliciet de shell specificeren die gebruikt zal worden wanneer het script direct wordt uitgevoerd met de sheebang
regel:
#!/bin/sh
of
#!/bin/bash
$SHELL
variabele wordt niet gebruikt om te beslissen welke shell de./executable
script. Het zegt ook niet ' wat de huidige shell is.