Wat is het verschil tussen bash en sh gebruiken om een script uit te voeren?

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

  • @Pandya De $SHELL variabele wordt niet gebruikt om te beslissen welke shell de ./executable script. Het zegt ook niet ' wat de huidige shell is.
  • @jlliagre oh! OK. wiki.debian.org zegt " SHELL = De huidige shell. "
  • @Pandya, het zou eigenlijk moeten zeggen " De login-shell van de gebruiker ' ". De huidige shell kan anders zijn.

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 dat sh een symbolische link is naar dash in plaats van bash. 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 en dash?
  • 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 is bash een shell met een behoorlijk groot aantal extensies en niet-standaardfuncties, sommige geïnspireerd door ksh, 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 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *