GNU/Linux >> Znalost Linux >  >> Linux

Co je Shebang v Linux Shell Scripting?

Často se setkáte se skripty shellu, které začínají:

#!/bin/bash

Tento #! se nazývá shebang nebo hashbang. Shebang hraje důležitou roli ve skriptování shellu, zvláště při práci s různými typy shellů.

V tomto tutoriálu se naučíte:

  • Co je Shebang?
  • Jak to hraje důležitou roli ve skriptování shellu?

Co je shebang ve skriptování shellu?

Shebang je kombinací # (klíč libry) a ! (vykřičník). Tato kombinace znaků má zvláštní význam, když je použita v úplně prvním řádku skriptu. Slouží k určení interpretu, se kterým bude daný skript standardně spouštěn.

Pokud je tedy první řádek skriptu:

#!/bin/bash

To znamená, že interpret by měl být bash shell. Pokud je první řádek:

#!/bin/zsh

To znamená, že interpretem, který se má použít, je Z shell.

#! je jistě speciální, protože # se používá pro komentáře ve skriptech shellu, ale zde má zvláštní význam.

Proč je shebang důležitý ve skriptování shellu?

Tady je ta věc. Shebang následovaný spustitelným souborem shellu není pro skript povinný.

Pokud napíšete jednoduchý skript, jako je tento:

echo "Namaste, folks!"

A dejte mu oprávnění ke spuštění a spusťte jej s příponou . operátor, bude spuštěn vaším přihlašovacím shellem.

[email protected]:~$ cat sample 
echo "Namaste, folks!"
[email protected]:~$ chmod u+x sample 
[email protected]:~$ ./sample 
Namaste, folks!

Proč tedy skripty shellu obsahují řádek #!/bin/bash na začátku skriptu?

Protože pro systémy Linux a UNIX je k dispozici několik shellů. Zatímco tyto shelly mají většinou společnou syntaxi, mají odlišnou syntaxi nebo jiný způsob zacházení s věcmi.

To je důvod, proč je důležité specifikovat ve skriptu správný interpret shellu, jinak mohou některé skripty při spuštění v různých shellech produkovat různé výsledky.

Dovolte mi, abych vám to ukázal na jednoduchém příkladu.

Důležitost zadání interpretu shellu pomocí shebang

Napsal jsem ukázkový skript shellu s řadou distribucí. Skript poté zobrazí distribuci na indexu 2.

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"

Nepřidal jsem řádek shebang, abych specifikoval jakýkoli interpret shellu. To znamená, že když spustím tento skript, bude spuštěn výchozím shellem (v mém případě bash):

[email protected]:~$ echo $0
bash

Dokážete odhadnout výstup skriptu?

[email protected]:~$ ./arrays.sh 
Distro at index 2 is: SUSE

Ukazuje SUSE na indexu 2, protože index pole začíná na 0 v Bash a mnoha dalších programovacích a skriptovacích jazycích. ALE to není případ Z shellu. V Z shellu začíná index pole na 1.

V systému mám nainstalovaný Z shell. Změním skript a přidám řádek shebang, který specifikuje, že skript by měl standardně spouštět Z shell.

#!/bin/zsh

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"

Dokážete uhodnout výstup, když nyní spustím skript?

[email protected]:~$ ./arrays.sh 
Distro at index 2 is: Fedora

Vnímáte teď ten rozdíl? Je to stejný skript, ale přidání řádku shebang udělalo rozdíl.

A to je důvod, proč je důležité specifikovat správný interpret shellu pomocí operátoru shebang. Jako správce systému můžete psát skripty prostředí s ohledem na konkrétní prostředí, ať už je to bash, ksh nebo zsh. Nemůžete si však být jisti, že systém, který bude spouštět skript, bude mít stejný výchozí shell jako váš. Teď věci dávají smysl, že?

Shebang je ignorován, pokud explicitně zadáte shell

Proč kladu důraz na "výchozí" shell? Protože shebang určuje interpret, se kterým se má skript spustit.

Můžete však specifikovat shell explicitně av takových případech bude řádek shebang ignorován.

Jak přesně shebang funguje?

Když použijete shebang na prvním řádku skriptu, říkáte shellu, aby spustil daný skript zadaným příkazem.

V podstatě #!/bin/zsh je ekvivalentní:

/bin/zsh script_name

Řekl jsem vám, že pokud první řádek skriptu začíná shebang, znamená to, že zadáváte interpret shellu.

To je pravda jen částečně. Ve skutečnosti je to účel postavy shebang. Ale není nutné, aby řádek shebang měl spustitelný soubor shellu. Může to být cokoliv.

Například se chystám nahradit #!/bin/zsh pomocí #!/bin/cat . /bin/cat je spustitelný soubor příkazu cat.

#!/bin/cat

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"

To znamená, že nyní bude tento skript spuštěn s cat příkaz a zobrazí obsah skriptu.

Bude fungovat, pokud ukazuje na spustitelný příkaz. Pokud vložíte nějaké náhodné věci, vyvolá to chybu.

Změním řádek shebang na:

#!/home/abhishek

Je zřejmé, že neukazuje na spustitelný soubor žádného příkazu, a proto vyvolává chybu špatného interpretu.

[email protected]:~$ cat arrays.sh 
#!/home/abhishek

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
[email protected]:~$ ./arrays.sh 
bash: ./arrays.sh: /home/abhishek: bad interpreter: Permission denied

Závěr

Než tento článek ukončím, dovolte mi odpovědět na několik dalších otázek:

  • Je důležité, aby mezi # nebyla mezera a ! . NEMŮŽETE jej použít takto:# !/bin/bash .
  • Většina systémů povoluje mezeru mezi #! a /bin/bash je však dobrým zvykem vyhýbat se mezerám mezi #! a /bin/bash .
  • #! musí být na prvním řádku, jinak bude řádek shebang považován za komentář. Nemůžete mít před ním ani prázdný řádek.

Doufám, že lépe rozumíte tomu, proč #! se používá na začátku shell skriptů v Linuxu. Pokud máte dotazy nebo návrhy, neváhejte zanechat komentář.


Linux
  1. 4 způsoby provádění skriptu Shell v systému UNIX / Linux

  2. Symbol backtick (`) v Linux Shell Scripting

  3. Spuštění skriptu z stdin (Linux/Shell Scripting)

  1. Co znamená `:-` ve skriptu Shell?

  2. Co je use() ve skriptování shellu?

  3. Šablony s Linuxem ve skriptu Shell?

  1. Jak analyzovat Json pomocí skriptování Shell v Linuxu?

  2. Co jsou Shell Scripts? Jak vytvořit Shell skripty?

  3. Transliterační skript pro linuxové prostředí