GNU/Linux >> Znalost Linux >  >> Linux

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

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ěme dash , 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.
Související:Procházení souborů s mezerami v názvech?

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.


Linux
  1. Bash skript:špatný interpret

  2. Je možné, aby skript bash shell interagoval s jiným programem příkazového řádku?

  3. základní jméno s mezerami ve skriptu bash?

  1. Jak zahrnout soubor do skriptu bash shell

  2. Shell skript změní adresář s proměnnou

  3. Jak přidat shebang #! s php skriptem na linuxu?

  1. Povolení bash.sh ke spuštění cronu odepřeno

  2. Přidání do $PYTHONPATH pomocí bash skriptu

  3. Jak zabít python skript pomocí bash skriptu