Mam kilka skryptów bash, których używam, z których najczęściej korzystam
#!/bin/bash
ale regularnie spotykam takie, które wyglądają
#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex
i tak dalej.
Czy ktoś może wyjaśnić znaczenie i zalety tych opcji shebang i czy dotyczą one innych shebangów?
Odpowiedzi:
Jeśli skrypt
/path/to/foo
zaczyna się od#!/bin/bash
, wówczas wykonywanie/path/to/foo arg1 arg2
jest równoważne wykonywaniu/bin/bash /path/too/foo arg1 arg2
. Jeśli linia shebang jest#!/bin/bash -ex
, jest to równoważne z wykonaniem/bin/bash -ex /path/too/foo arg1 arg2
. Ta funkcja jest zarządzana przez jądro.Zauważ, że możesz przenośnie mieć tylko jeden argument w linii shebang: niektóre jednorożce (takie jak Linux) akceptują tylko jeden argument, więc
#!/bin/bash -e -x
doprowadziłoby to do tego, że bash otrzymałby pojedynczy pięcioznakowy argument-e -x
(błąd składniowy) zamiast dwóch argumentów-e
i-x
.W przypadku powłoki Bourne'a
sh
i pochodnych powłok, takich jak POSIX sh, bash, ksh i zsh:-e
oznacza, że jeśli dowolne polecenie nie powiedzie się (co wskazuje na zwrócenie niezerowego statusu), skrypt natychmiast się zakończy.-x
powoduje, że powłoka drukuje ślad wykonania.Inne programy mogą zrozumieć te opcje, ale mają różne znaczenia.
źródło
Są to opcje przekazane, aby
bash
zobaczyćhelp set
więcej informacji, w tym przypadku:źródło
-ex
robi obaman bash
)In addition to the single-character shell options documented in the description of the set builtin command, bash interprets the following options when it is invoked: [...]
.Chciałbym tylko wspomnieć o jeszcze lepszej - jak w bardziej przenośnej - alternatywie:
W powyższym przykładzie
env
znajduje siębash
plik wykonywalny, który nie zawsze jest dostępny/bin/bash
. Stare#!/bin/bash
skrypty nie działają na przykład w systemie NixOS .Jeśli używasz
env
, jak wykazano powyżej, nie może dostarczyć argumentów, takich jak-e
nabash
(o ile wiem). Ale możesz to zrobić zamiast tego:źródło
env
użycie nie jest dobre, szczególnie w przypadku skryptów uruchamiających Python, ponieważ po prostu nie wiesz, czy domyślnąpython
jest wersja 2 czy 3, a to robi różnicę w przypadku skryptów, które wymagają określonej wersji. Lepiej być wyraźnym niż podstępnym