GNU/Linux >> Znalost Linux >  >> Linux

Proč potřebujete umístit #!/bin/bash na začátek souboru skriptu?

Je to konvence, takže shell *nix ví, jaký druh interpretu spustit.

Například starší verze ATT měly výchozí hodnotu sh (Bourne shell), zatímco starší verze BSD měly výchozí hodnotu csh (C shell).

Dokonce i dnes (kde většina systémů spouští bash, "Bourne Again Shell" ), skripty mohou být v bash, python, perl, ruby, PHP atd., atd. Můžete například vidět #!/bin/perl nebo #!/bin/perl5 .

PS:Vykřičník (! ) se láskyplně nazývá "bang" . Symbol komentáře shellu (# ) se někdy nazývá "hash" .

PPS:Pamatujte - pod *nix je přiřazení přípony k typu souboru pouze konvencí , nikoli „pravidlo“ . Spustitelný soubor může být binární program, kterýkoli z milionu typů skriptů a další věci. Proto je potřeba #!/bin/bash .


Přesněji řečeno, shebang #! , když se jedná o první dva bajty spustitelného souboru (x mode), je interpretován systémovým voláním execve(2) (které spouští programy). Ale specifikace POSIX pro execve nezmiňujte shebang.

Musí za ním následovat cesta k souboru spustitelného interpretu (který BTW může být dokonce relativní, ale nejčastěji je absolutní).

Pěkný trik (nebo možná ne tak dobrý), jak najít tlumočníka (např. python ) v uživatelském $PATH je použít env program (vždy na /usr/bin/env na všech Linuxech), jako je např.

 #!/usr/bin/env python

Jakýkoli spustitelný soubor ELF může být interpretem. Můžete dokonce použít #!/bin/cat nebo #!/bin/true kdybys chtěl! (ale to by bylo často k ničemu)


Říká se tomu shebang. V unixovém jazyce se # nazývá ostrý (jako v hudbě) nebo hash (jako hashtagy na Twitteru) a ! se nazývá bang. (Ve skutečnosti můžete odkazovat na svůj předchozí příkaz shell s !!, nazvaný bang-bang). Takže když to dáte dohromady, dostanete haSH-BANG nebo shebang.

Část po #! říká Unixu, jaký program použít ke spuštění. Pokud není zadán, zkusí to s bash (nebo sh, nebo zsh, nebo jaká je vaše proměnná $SHELL), ale pokud tam je, použije tento program. Navíc # je ve většině jazyků komentář, takže při následném spuštění je řádek ignorován.


Linux
  1. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  2. Proč skript Bash nerozpozná aliasy?

  3. Jak zkontrolovat podřetězec v Shell Script Bash?

  1. Proč /bin/sh ukazuje na /bin/dash a ne /bin/bash?

  2. Jaký je rozdíl mezi #!/usr/bin/env bash a #!/usr/bin/bash?

  3. Spusťte příkaz bash na jenkins pipeline

  1. Proč je proměnná viditelná v podslupce?

  2. cmake --version ukazuje na /usr/bin/cmake, zatímco který cmake ukazuje na /usr/local/bin

  3. Jaké velikosti byste měli přidělit /, /boot, /home a swap