GNU/Linux >> Znalost Linux >  >> Linux

Shell skript funguje dobře bez řádky shebang? Proč?

Standard POSIX (Single UNIX Specification 4) není užitečný:

Pokud první řádek souboru příkazů shellu začíná znaky "#!" , výsledky nejsou specifikovány.

Standard tedy znamená, že pokud nemáte #! pak by měl spustit shell POSIX. Ale moderní shelly nejsou kompatibilní s POSIX. Starý Korn Shell 88 (ksh88) provozoval Bourne shell (blízko shellu POSIX) bez #! řádek, ale ksh93 to porušuje, stejně jako Bash. S ksh93 a Bash spouštějí svůj vlastní shell, pokud nemají #! řádek je přítomen.

Navzdory všeobecnému názoru se granáty Bash a Korn liší. Když píšete shellový skript, nikdy si nemůžete být jisti, z jakého shellu budete spouštěni, nebo dokonce, zda vůbec bude spuštěn z jiného shellu (většina programovacích jazyků umí spouštět jiné programy). Ve chvíli, kdy použijete něco mimo syntaxi Bourne/POSIX, budete zmařeni.

Vždy používejte #! line, nenechte to náhodě.


Nadřazený shell, kde jste zadali ./myscript.sh , nejprve zkusil execve to je místo, kde by linie shebang vstoupila v platnost, pokud by byla přítomna. Když to funguje, rodič si není vědom rozdílu mezi skripty a ELF, protože se o to postará jádro.

execve selhal, takže byla aktivována prastará funkce kompatibility unixu, která předcházela existenci linií shebang. Uhádlo, že soubor, který má oprávnění ke spuštění, ale jádro jej nerozpozná jako platný spustitelný soubor, musí být skript shellu.

Nadřazený shell obvykle odhadne, že skript je napsán pro stejný shell (minimální shelly podobné Bourneovi spustí skript s /bin/sh , bash jej spouští jako bash subproces), csh dělá trochu složitější hádání na základě prvního znaku, protože také předchází shebang a potřeboval koexistovat s Bourne shellem).

Pokud víte, že tyto odhady budou chybné, potřebujete řádek shebang (například u shebang je #!/usr/bin/perl ), nebo když nedůvěřujete tomu, že hádání bude fungovat konzistentně, nebo když skript musí být spustitelný nadřazeným procesem, který sám o sobě není shell.


Shebang line je potřeba v soubor a pouze v případě, že má být spuštěn jako spustitelný (na rozdíl od sh file.sh vyvolání. Skript to ve skutečnosti nepotřebuje, je to na systému, aby věděl, jak najít interpreta.

UPRAVIT :Omlouvám se za špatné přečtení otázky. Pokud řádek shebang chybí nebo není rozpoznán, /bin/sh se používá. Ale dávám přednost explicitnímu vyjádření o tlumočníkovi.

Všimněte si, že toto chování není univerzální, IIRC, pouze některé exec* rodinná funkce to dělá (nemluvě o různých platformách), takže to je další důvod, proč to zde být explicitní.


Linux
  1. Změňte pracovní adresář v shellu pomocí python skriptu

  2. Shell Script, čtěte na stejném řádku po ozvěně zprávy

  3. Ubuntu Python shebang line nefunguje

  1. Jak vložit nový řádek do skriptu prostředí Linux?

  2. Výpočet zaokrouhlených procent v Shell Script bez použití bc

  3. Jak spustit soubor bez přípony .sh v shellu

  1. Který Shell Interpreter spouští skript s No Shebang?

  2. Časový limit ve skriptu Shell?

  3. shebang nebo ne shebang