Jak uruchomić skrypt powłoki na konsoli Unix lub terminalu Mac?

Wiem o tym, zapomnij o tym i naucz się tego jeszcze raz. Czas to zapisać.

Author: codeforester, 2009-04-09

6 answers

Aby uruchomić skrypt nie wykonywalny sh, użyj:

sh myscript

Aby uruchomić skrypt nie wykonywalny bash, użyj:

bash myscript

Aby uruchomić plik wykonywalny( który jest dowolnym plikiem z uprawnieniami wykonywalnymi); wystarczy podać go ścieżką:

/foo/bar
/bin/bar
./bar

Aby skrypt był wykonywalny, daj mu niezbędne uprawnienia:

chmod +x bar
./bar

Gdy plik jest wykonywalny, jądro jest odpowiedzialne za wymyślenie, jak go wykonać. W przypadku nie-binarnych, robi się to patrząc na pierwsze linia pliku. Powinno zawierać hashbang:

#! /usr/bin/env bash

Hashbang informuje jądro, jaki program ma uruchomić(w tym przypadku Komenda {[11] } jest uruchamiana z argumentem bash). Następnie skrypt jest przekazywany do programu (jako drugi argument) wraz ze wszystkimi argumentami, które podałeś skrypt jako kolejne argumenty.

To znaczy każdy skrypt wykonywalny powinien mieć hashbang. Jeśli nie, nie powiesz jądrowi, co to jest , a zatem jądro nie wie, jakiego programu użyć do jego interpretacji. Może być bash, perl, python, sh, albo coś innego. (W rzeczywistości jądro często używa domyślnej powłoki użytkownika do interpretacji pliku, co jest bardzo niebezpieczne, ponieważ może nie być w ogóle właściwym interpreterem lub może być w stanie przetworzyć niektóre z nich, ale z subtelnymi różnicami behawioralnymi, takimi jak między sh i bash).

Notka o /usr/bin/env

Najczęściej zobaczysz grzywkę hash tak:

#!/bin/bash

Rezultatem jest to, że jądro uruchomi program /bin/bash, aby zinterpretować skrypt. Niestety, bash nie zawsze jest dostarczany domyślnie i nie zawsze jest dostępny w /bin. Podczas gdy na maszynach Linuksowych zwykle tak jest, istnieje szereg innych maszyn POSIX, gdzie bash jest wysyłany w różnych miejscach, takich jak /usr/xpg/bin/bash lub /usr/local/bin/bash.

Aby napisać przenośny skrypt bash, nie możemy więc polegać na kodowaniu na twardo lokalizacji bash programu. POSIX już ma mechanizm radzenia sobie z tym: PATH. Chodzi o to, że instalujesz programy w jednym z katalogów, które są w PATH, a system powinien być w stanie znaleźć Twój program, gdy chcesz go uruchomić po nazwie.

Niestety, ty nie można po prostu zrób to:

#!bash

Jądro nie będzie (niektórzy mogą) szukać Ciebie. Istnieje jednak program, który może wykonać PATH wyszukiwanie dla Ciebie, nazywa się env. Na szczęście prawie wszystkie systemy mają]} program zainstalowany w /usr/bin. Zaczynamy więc env używając zakodowanej na twardo ścieżki, która następnie PATH wyszukuje bash i uruchamia ją tak, aby mogła zinterpretować Twój skrypt:

#!/usr/bin/env bash

To podejście ma jeden minus: zgodnie z POSIX, hashbang może mieć jeden argument. W tym przypadku używamy bash jako argumentu programu env. Oznacza to, że nie mamy już miejsca na przekazanie argumentów bash. Więc nie ma sposobu, aby przekonwertować coś takiego jak #!/bin/bash -exu do tego schematu. Będziesz musiał umieść set -exu za hashbang zamiast.

To podejście ma również inną zaletę: niektóre systemy mogą wysyłać z /bin/bash, ale użytkownik może nie lubić go, może uznać, że jest wadliwy lub przestarzały i może zainstalować swój własny bash gdzie indziej. Często dzieje się tak na OS X (Mac), gdzie Apple wysyła przestarzałą /bin/bash, a użytkownicy instalują aktualną /usr/local/bin/bash używając czegoś takiego jak Homebrew. Kiedy używasz metody env, która wykonuje wyszukiwanie PATH, bierzesz pod uwagę preferencje użytkownika i użyć jego preferowanego bash zamiast tego, z którym dostarczany jest jego system.

 876
Author: lhunath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-04 16:04:40

Aby uruchomić shell-script 'file.sh": {]}

sh file.sh

bash file.sh

Inną opcją jest ustawienie uprawnień wykonywalnych przy użyciu polecenia chmod:

chmod +x file.sh

Uruchom plik. sh w następujący sposób:

./file.sh
 73
Author: P-A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-09 11:52:29

Dla powłoki bourne ' a:

sh myscript.sh

Dla Basha:

bash myscript.sh
 13
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-09 11:39:34

Jeśli chcesz, aby skrypt działał w bieżącej powłoce (np. aby mógł wpływać na twój katalog lub środowisko), powinieneś powiedzieć:

. /path/to/script.sh

Lub

source /path/to/script.sh

Zauważ, że /path/to/script.sh może być względny, na przykład . bin/script.sh uruchamia script.sh w katalogu bin pod bieżącym katalogiem.

 10
Author: Chas. Owens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-09 12:42:16

Po pierwsze, daj pozwolenie na wykonanie:-
chmod +x script_name

  1. jeśli skrypt nie jest wykonywalny:-
    Do uruchomienia pliku skryptu sh:-
    sh script_name
    Do uruchomienia pliku skryptu bash:-
    bash script_name
  2. jeśli skrypt jest wykonywalny:-
    ./script_name

Uwaga:-możesz sprawdzić, czy plik jest wykonywalny, używając 'ls-a'

 0
Author: Vineet Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-06 07:24:58

Rozszerzenie pliku .polecenie jest przypisane do terminala.app. Podwójne kliknięcie na dowolnym .command file go wykona.

 0
Author: benwiggy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-02 13:11:14