Předpokládejme, že výchozí shell pro můj účet je zsh, ale otevřel jsem terminál a spustil bash a spustil skript s názvem prac002.sh
, který interpret shellu by byl použit ke spuštění skriptu, zsh nebo bash? Zvažte následující příklad:
[email protected] ~/My Files/My Programs/Learning/Shell % sudo cat /etc/passwd | grep papagolf
[sudo] password for papagolf:
papagolf:x:1000:1001:Rex,,,:/home/papagolf:/usr/bin/zsh
# papagolf's default shell is zsh
[email protected] ~/My Files/My Programs/Learning/Shell % bash
# I fired up bash. (See that '%' prompt in zsh changes to '$' prompt, indicating bash.)
[email protected]:~/My Files/My Programs/Learning/Shell$ ./prac002.sh
Enter username : Rex
Rex
# Which interpreter did it just use?
**UPRAVIT:** Zde je obsah skriptu
[email protected] ~/My Files/My Programs/Learning/Shell % cat ./prac002.sh
read -p "Enter username : " uname
echo $uname
Přijatá odpověď:
Protože skript nezačíná znakem #!
Shebang řádek označující, který interpret se má použít, POSIX říká, že:
Pokud
execl()
funkce selže kvůli chybě ekvivalentní chybě [ENOEXEC] definované ve svazku System Interfaces POSIX.1-2008, shell provede příkaz ekvivalentní vyvolání shellu s názvem cesty vyplývajícím z hledání jako jeho první operand , se všemi zbývajícími argumenty předanými do nového shellu, kromě toho, že hodnota „$0“ v novém shellu může být nastavena na název příkazu. Pokud spustitelný soubor není textový soubor, může shell obejít tento příkaz. V tomto případě zapíše chybovou zprávu a vrátí návratový stav 126.
Tato formulace je trochu nejednoznačná a různé skořápky mají různé interpretace.
V tomto případě Bash spustí skript pomocí sebe . Na druhou stranu, pokud byste jej spustili ze zsh, zsh by použil sh
(ať už je to ve vašem systému cokoli).
Toto chování můžete v tomto případě ověřit přidáním těchto řádků do skriptu:
echo $BASH_VERSION
echo $ZSH_VERSION
Všimněte si, že z Bash první řádek zobrazuje vaši verzi, zatímco druhý nikdy nic neříká, bez ohledu na to, jaký shell používáte.
- Pokud váš
/bin/sh
je řekněmedash
, pak žádný řádek nevypíše nic, když je skript spuštěn ze zsh nebo pomlčky. - Pokud váš
/bin/sh
je odkaz na Bash, ve všech případech uvidíte výstup prvního řádku. - Pokud
/bin/sh
je jiná verze Bash, než jste používali přímo, uvidíte jiný výstup, když spustíte skript přímo z bash a ze zsh.
ps -p $$
příkaz z odpovědi rools také zobrazí užitečné informace o příkazu, který shell použil ke spuštění skriptu.