Odpowiedzi:
Aby uruchomić niewykonywalny sh
skrypt, użyj:
sh myscript
Aby uruchomić niewykonywalny bash
skrypt, 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/env
jest 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 sh
i bash
).
/usr/bin/env
Najczęściej zobaczysz takie hash bang:
#!/bin/bash
W rezultacie jądro uruchomi program w /bin/bash
celu interpretacji skryptu. Niestety bash
nie 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ą bash
wysyłane w różnych lokalizacjach, takich jak /usr/xpg/bin/bash
lub /usr/local/bin/bash
.
Aby napisać przenośny skrypt bash, nie możemy zatem polegać na twardym kodowaniu lokalizacji bash
programu. POSIX ma już mechanizm radzenia sobie z tym: PATH
. Chodzi o to, że instalujesz programy w jednym z katalogów, które się znajdują, PATH
a 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ą) PATH
szukać ciebie. Istnieje jednak program, który może przeprowadzić PATH
wyszukiwanie, nazywa się env
. Na szczęście prawie wszystkie systemy mają env
zainstalowany program /usr/bin
. Dlatego zaczynamy env
używać zakodowanej ścieżki, która następnie PATH
wyszukuje bash
i 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 bash
jako argumentu env
programu. Oznacza to, że nie mamy już miejsca na przekazywanie argumentów bash
. Więc nie ma sposobu, aby przekonwertować coś takiego #!/bin/bash -exu
na ten schemat. Zamiast tego będziesz musiał położyć set -exu
hashbang.
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 bash
gdzieś indziej. Dzieje się tak często w przypadku systemu OS X (Mac), w którym Apple dostarcza nieaktualne, /bin/bash
a użytkownicy instalują aktualne /usr/local/bin/bash
wersje, używając czegoś takiego jak Homebrew. Kiedy korzystasz z env
metody PATH
wyszukiwania, bierzesz pod uwagę preferencje użytkownika i używasz jego preferowanego basha w stosunku do tego, z którym został dostarczony system.
zsh
jako mojej powłoki, czy użyłbym hashbang
#! /usr/bin/env zsh
?
#! /usr/bin/env zsh
jeś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.sh
może być względna, na przykład . bin/script.sh
uruchamia script.sh
w bin
katalogu w bieżącym katalogu.
Najpierw zezwól na wykonanie: -
chmod +x script_name
sh script_name
bash script_name
./script_name
UWAGA : -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