Jaký je rozdíl mezi spuštěním skriptu pomocí bash a sh?

Provádí bash a sh skript jinak? Provedl jsem shell skript s bash i sh a dostal stejný výstup. V čem je tedy rozdíl?

Také když právě spustíte ./executable, používá bash nebo sh?

Komentáře

  • @Pandya Proměnná $SHELL se nepoužívá k rozhodnutí, jaký shell bude interpretovat ./executable skript. To ' nutně neříká, jaký je aktuální shell.
  • @jlliagre oh! OK. wiki.debian.org říká " SHELL = Aktuální prostředí. "
  • @ Pandya, ve skutečnosti by mělo být uvedeno " Přihlašovací prostředí uživatele ' ". Aktuální prostředí se může lišit.

Odpověď

To záleží na systému, který používáte. Jeden z mnoha operačních systémů, zejména operačních systémů Linux, sh je odkaz na bash.

V takovém případě existuje stále existují určité rozdíly v chování, kde bash se snaží být více jako tradiční bourne shell, když se nazývá sh, ale stále přijímá většinu bashismů.

V některých jiných operačních systémech, jako jsou systémy založené na Debianu, sh poskytuje dash, nikoli bash. To je mnohem větší rozdíl, protože dash nepodporuje bashismy, protože je navržen jako čistá implementace prostředí POSIX.

V proprietárních operačních systémech často poskytuje POSIX kompatibilní ksh88, který podobně jako dash neimplementuje bashismy. V systému Solaris 10 a starších bude sh v závislosti na vaší PATH pravděpodobně starým Bourneovým shellem, který bude předcházet POSIX.

V každém případě budete pravděpodobně mít stejný výstup s testem jednoduše proto, že váš skript nepoužíval žádný bash konkrétní příkaz, volbu nebo syntaxi.

Když spustíte ./executable, jaký shell bude spuštěn, v zásadě závisí na shebangu napsaném na začátku skriptu .executable. To bude bash, pokud to specifikuje shebang:

#!/bin/bash .... 

Pokud neexistuje žádný shebang a zavoláte skript z prostředí kompatibilního s POSIXem by měl být skript technicky proveden prvním sh nalezeným v PATH. Mnoho interpretů prostředí jako bash, dash a ksh se považují za POSIX, takže interpretovat scénář. Proměnná prostředí SHELL se zde nepoužívá.

Komentáře

  • Rozhlížel jsem se kolem v /bin a zjistil jsem, že sh je spíše symbolický odkaz na dash než bash. Jak tedy běžely stejně? Nebylo ' skutečně spuštěno žádné příkazy bash skriptu, pouze příkazy terminálu pro použití jiných nástrojů ' nástrojů.
  • Pokud váš shell skript právě postupně volá další příkazy, jakýkoli interpreter prostředí jej spustí se stejným výsledkem. Zde nic neočekávaného.
  • Toto nesouvisí s otázkou, ale jaký je přesně rozdíl mezi bash a dash?
  • Oba používají syntaxi prostředí Bourne. Jak jsem napsal ve své odpovědi, dash je čistá implementace standardu prostředí POSIX. Na druhou stranu bash je prostředí s poměrně velkým množstvím rozšíření a nestandardními funkcemi, některé inspirované ksh, ksh93 a další skořápky a některé specifické pro bash, známé jako bashismy. Existuje nástroj s názvem checkbashisms, který pomáhá identifikovat vše, co není v daném shell skriptu přísně přenositelné.

Odpovědět

Ano, mohlo by to být, ale nemusí to tak být. Dvě skořápky nejsou stejné, ale základní informace jsou kompatibilní. Další podrobnosti najdete v tomto příspěvku .

Následující skript můžete použít ke kontrole použitého tlumočníka:

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

Můžete explicitně určit shell, který se použije při provádění skriptu přímo pomocí sheebang řádku:

#!/bin/sh 

nebo

#!/bin/bash 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *