Dzięki za cały wkład. Spróbuję teraz odpowiedzieć na własne pytanie i dostarczyć kompletny przewodnik po różnych możliwościach wykonywania skryptów i plików binarnych. Edytuj i komentuj, a my będziemy w stanie wymyślić coś kompletnego i poprawnego. Oto moja sugestia:
Na początek dwa punkty do stwierdzenia:
Linux rozróżnia polecenie i ścieżkę . Komenda jest wpisany tylko jak jest na wierszu poleceń i wykona wbudowany lub spowoduje Linux szukać odpowiedniego pliku binarnego lub skryptu na $ PATH.
Aby Linux zinterpretował coś jako ścieżkę, musi zawierać co najmniej jeden ukośnik (/). Np ./myScript
, ./
może wydawać się całkiem zbędny - to nie tylko, aby Linux interpretować go jako ścieżki zamiast polecenia.
Tak więc opcje wykonania pliku binarnego lub skryptu:
Wykonywanie pliku binarnego binary
:
$ binary # when 'binary' is on the PATH, or is a built-in
$ ./binary # when 'binary' is not on the path but in the current directory
$ /home/me/binary # when 'binary' is not on the PATH, and not in the current dir
Wykonywanie skryptu script
:
Plik będzie musiał mieć uprawnienia do wykonywania, chyba że zaznaczono inaczej.
$ script # execute a script that is on PATH. Will be executed in a new shell.
# The interpreter to use is determined by the she-bang in the file.
$ ./script # execute a script that is in the current dir. Otherwise as above.
$ /a/dir/script # when the script is not on the PATH and not in current dir.
# Otherwise as above.
$ . script # execute a script in the current dir. Will be executed in the
# current shell environment.
$ source script # equivalent to the above *1
$ sh script # executes 'script' in a new shell *2 (the same goes for 'bash ...',
# 'zsh ...' etc.). Execute permission not neccessary.
O grze She-Bangs :
Skrypty z she-hukiem (np. #!/bin/sh
) W pierwszym wierszu informują, którego interpretatora użyć.
- Ten interpreter będzie używany, gdy zostanie wykonany przy
./script
użyciu polecenia lub przy użyciu polecenia: script
( script
musi znajdować się w ścieżce PATH)
- Użycie
sh script
zignoruje she-bang i użyje, w tym przypadku, sh
jako tłumacza
- Użycie
. script
lub source
zignoruje she-bang i użyje bieżącego interpretera (ponieważ .
lub source
jest równoważne z wykonaniem każdej linii skryptu w bieżącej powłoce)
Przypisy
* 1: To jest tylko prawie prawda. W bash rzeczywiście są one takie same polecenia, ale podczas używania source
, script
będą wyszukiwane w $ PATH przed bieżącym katalogu. To bash, ale w powłokach tylko POSIX source
nie działa, ale .
działa. Raczej używaj tego drugiego do przenoszenia.
* 2: tak naprawdę dzieje się tak, że uruchamiamy binarny sh z argumentem „script”, co spowoduje, że „sh” wykona „skrypt” w swojej nowej powłoce