Odpowiedzi:
Aby uruchomić niewykonywalny shskrypt, użyj:
sh myscript
Aby uruchomić niewykonywalny bashskrypt, użyj:
bash myscript
Aby uruchomić plik wykonywalny (dowolny plik z uprawnieniami do pliku wykonywalnego); po prostu określ go według ścieżki:
/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 wywołać. W przypadku plików innych niż pliki binarne można to zrobić, patrząc na pierwszą linię pliku. Powinien zawierać hashbang:
#! /usr/bin/env bash
Hashbang informuje jądro, który program ma zostać uruchomiony (w tym przypadku polecenie /usr/bin/envjest uruchamiane z argumentem bash). Następnie skrypt jest przekazywany do programu (jako drugi argument) wraz ze wszystkimi argumentami podanymi w skrypcie jako kolejne argumenty.
Oznacza to, że każdy skrypt, który można wykonać, powinien mieć hashbang . Jeśli nie, to nie mówisz jądru, co to jest , dlatego jądro nie wie, jakiego programu użyć do jego interpretacji. To może być bash, perl, python, sh, lub 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ć wcale właściwym interpreterem lub może być w stanie parsować niektóre z nich, ale z subtelnymi różnicami behawioralnymi, takimi jak przypadek między shi bash).
/usr/bin/envNajczęściej zobaczysz takie hash bang:
#!/bin/bash
W rezultacie jądro uruchomi program w /bin/bashcelu interpretacji skryptu. Niestety bashnie zawsze jest domyślnie wysyłany i nie zawsze jest dostępny w /bin. Podczas gdy na maszynach z Linuksem zwykle tak jest, istnieje wiele innych maszyn POSIX, które są bashwysyłane w różnych lokalizacjach, takich jak /usr/xpg/bin/bashlub /usr/local/bin/bash.
Aby napisać przenośny skrypt bash, nie możemy zatem polegać na twardym kodowaniu lokalizacji bashprogramu. POSIX ma już mechanizm radzenia sobie z tym: PATH. Chodzi o to, że instalujesz programy w jednym z katalogów, które się znajdują, PATHa system powinien być w stanie znaleźć Twój program, gdy chcesz go uruchomić według nazwy.
Niestety nie można tego po prostu zrobić:
#!bash
Jądro nie będzie (niektórzy mogą) PATHszukać ciebie. Istnieje jednak program, który może przeprowadzić PATHwyszukiwanie, nazywa się env. Na szczęście prawie wszystkie systemy mają envzainstalowany program /usr/bin. Dlatego zaczynamy envużywać zakodowanej ścieżki, która następnie PATHwyszukuje bashi uruchamia ją, aby mogła zinterpretować twój skrypt:
#!/usr/bin/env bash
To podejście ma jedną wadę: Według POSIX, hashbang może mieć jeden argument . W tym przypadku używamy bashjako argumentu envprogramu. Oznacza to, że nie mamy już miejsca na przekazywanie argumentów bash. Więc nie ma sposobu, aby przekonwertować coś takiego #!/bin/bash -exuna ten schemat. Zamiast tego będziesz musiał położyć set -exuhashbang.
Podejście to ma również inną zaletę: niektóre systemy mogą być dostarczane z /bin/bash, ale użytkownikowi może się to nie podobać, może być wadliwe lub przestarzałe i może zainstalować własne bashgdzieś indziej. Dzieje się tak często w przypadku systemu OS X (Mac), w którym Apple dostarcza nieaktualne, /bin/basha użytkownicy instalują aktualne /usr/local/bin/bashwersje, używając czegoś takiego jak Homebrew. Kiedy korzystasz z envmetody PATHwyszukiwania, bierzesz pod uwagę preferencje użytkownika i używasz jego preferowanego basha w stosunku do tego, z którym został dostarczony system.
zshjako mojej powłoki, czy użyłbym hashbang #! /usr/bin/env zsh?
#! /usr/bin/env zshjeśli (i tylko jeśli) kod w skrypcie powinien zostać wykonany przez powłokę Z.
W przypadku powłoki Bourne'a:
sh myscript.sh
Do bash:
bash myscript.sh
Jeśli chcesz, aby skrypt działał w bieżącej powłoce (np. Chcesz, aby mógł wpływać na twój katalog lub środowisko), powinieneś powiedzieć:
. /path/to/script.sh
lub
source /path/to/script.sh
Uwaga: /path/to/script.shmoże być względna, na przykład . bin/script.shuruchamia script.shw binkatalogu w bieżącym katalogu.
Najpierw zezwól na wykonanie: -
chmod +x script_name
sh script_namebash script_name./script_nameUWAGA : -można sprawdzić, czy plik jest wykonywalny, czy nie, używając „ls -a”
Mały dodatek, aby uruchomić interpreter z tego samego folderu, nadal używając #! Hashbang w skryptach.
Na przykład plik wykonywalny php7.2 skopiowany z / usr / bin znajduje się w folderze wzdłuż skryptu hello .
#!./php7.2
<?php
echo "Hello!";
Aby uruchomić:
./hello
Które zachowują się tak samo jak:
./php7.2 hello