GNU/Linux >> Znalost Linux >  >> Linux

Jak spustit skript shellu na konzole Unix nebo terminálu Mac?

Chcete-li spustit skript shellu 'file.sh':

sh file.sh

bash file.sh

Další možností je nastavit oprávnění ke spuštění pomocí příkazu chmod:

chmod +x file.sh

Nyní spusťte soubor .sh následovně:

./file.sh

Chcete-li spustit nespustitelný soubor sh skript, použijte:

sh myscript

Chcete-li spustit nespustitelný soubor bash skript, použijte:

bash myscript

Spuštění spustitelného souboru (což je jakýkoli soubor s oprávněním ke spuštění); stačí jej zadat jeho cestou:

/foo/bar
/bin/bar
./bar

Chcete-li, aby byl skript spustitelný, udělte mu potřebná oprávnění:

chmod +x bar
./bar

Když je soubor spustitelný, jádro je zodpovědný za to, jak to provést. U nebinárních souborů se to provede pohledem na první řádek souboru. Měl by obsahovat hashbang :

#! /usr/bin/env bash

Hashbang říká jádru, jaký program má spustit (v tomto případě příkaz /usr/bin/env je spuštěn s argumentem bash ). Poté je skript předán programu (jako druhý argument) spolu se všemi argumenty, které jste skriptu zadali jako následující argumenty.

To znamená, že každý spustitelný skript by měl mít hashbang . Pokud ne, neříkáte jádru, co to je je , a proto jádro neví, jaký program použít k jeho interpretaci. Může to být bash , perl , python , sh , nebo něco jiného. (Ve skutečnosti jádro často používá výchozí shell uživatele k interpretaci souboru, což je velmi nebezpečné, protože to nemusí být vůbec správný interpret nebo může být schopno analyzovat některé z nich, ale s jemnými rozdíly v chování, jako je např. případ mezi sh a bash ).

Poznámka k /usr/bin/env

Nejčastěji uvidíte hash bang takto:

#!/bin/bash

Výsledkem je, že jádro spustí program /bin/bash interpretovat scénář. Bohužel bash není vždy dodáván ve výchozím nastavení a není vždy dostupný v /bin . Zatímco na počítačích Linux to obvykle je, existuje řada dalších počítačů POSIX, kde bash dodává na různých místech, například /usr/xpg/bin/bash nebo /usr/local/bin/bash .

Při psaní přenosného bash skriptu se proto nemůžeme spoléhat na pevné kódování umístění bash program. POSIX již má mechanismus, jak se s tím vypořádat:PATH . Myšlenka je taková, že nainstalujete své programy do jednoho z adresářů, které jsou v PATH a systém by měl být schopen najít váš program, když jej chcete spustit podle názvu.

Bohužel nemůžete stačí udělat toto:

#!bash

Jádro neprovede (někteří možná) PATH hledat tě. Existuje program, který umí PATH vyhledat vás, nazývá se to env . Naštěstí téměř všechny systémy mají env program nainstalovaný v /usr/bin . Začneme tedy env pomocí pevně zakódované cesty, která pak provede PATH vyhledejte bash a spustí jej, aby mohl interpretovat váš skript:

#!/usr/bin/env bash

Tento přístup má jednu nevýhodu:Podle POSIX může mít hashbang jeden argument . V tomto případě použijeme bash jako argument pro env program. To znamená, že nám nezbývá místo pro předání argumentů do bash . Takže neexistuje způsob, jak převést něco jako #!/bin/bash -exu k tomuto schématu. Budete muset zadat set -exu místo toho po hashbang.

Tento přístup má také další výhodu:Některé systémy mohou být dodávány s /bin/bash , ale uživateli se to nemusí líbit, může se mu zdát chybný nebo zastaralý a možná si nainstaloval vlastní bash někde jinde. To je často případ OS X (Mac), kde Apple dodává zastaralý /bin/bash a uživatelé si nainstalují aktuální /usr/local/bin/bash pomocí něčeho jako Homebrew. Když použijete env přístup, který dělá PATH vyhledávání, vezmete v úvahu preference uživatele a použijete jeho preferovaný bash před tím, se kterým jeho systém dodal.


Pro bourne shell:

sh myscript.sh

Pro bash:

bash myscript.sh

Linux
  1. Jak spustit příkazy bash Linuxu ve skriptu PERL?

  2. Jak přeložit název hostitele na IP adresu v Bash skriptu?

  3. Jak zastavit skript Loop Bash v terminálu?

  1. Spusťte shell skript v novém terminálu z aktuálního terminálu

  2. Jak opakovaně spouštět bash skript každých N sekund?

  3. Jak spustit skript .sh z libovolné cesty v terminálu?

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

  2. Jak spustit skript Shell na pozadí?

  3. Jak spouštět skripty Pythonu ze shellu