Czy można sprawdzić składnię skryptu bash bez wykonywania go?
Używając Perla, mogę biegać perl -c 'script name'
. Czy istnieje jakieś równoważne polecenie dla skryptów bash?
Czy można sprawdzić składnię skryptu bash bez wykonywania go?
Używając Perla, mogę biegać perl -c 'script name'
. Czy istnieje jakieś równoważne polecenie dla skryptów bash?
Odpowiedzi:
bash -n scriptname
Być może oczywiste zastrzeżenie: sprawdza poprawność składni, ale nie sprawdza, czy skrypt bash próbuje wykonać polecenie, które nie jest na twojej ścieżce, jak ech hello
zamiast echo hello
.
set
jednoznakowe.
if ["$var" == "string" ]
, zamiastif [ "$var" == "string" ]
type [
mówi „[jest wbudowaną powłoką”. Ostatecznie deleguje się do test
programu, ale oczekuje również zamknięcia. Więc to jest if test"$var"
, co nie jest tym, co miał na myśli autor, ale jest poprawne składniowo (powiedzmy, że $ var ma wartość „a”, wtedy zobaczymy „bash: testa: komenda nie znaleziona”). Chodzi o to, że składniowo nie brakuje miejsca.
[
jest wywoływany tylko w tym przypadku, jeśli $var
zdarzy się rozwinąć do pustego ciągu . Jeśli $var
rozwija się do niepustego łańcucha, [
jest łączony z tym łańcuchem i interpretowany przez Bash jako nazwa polecenia (nie nazwa funkcji ), i tak, jest poprawny pod względem składniowym , ale, jak sam twierdzisz, oczywiście nie jest to intencją. Jeśli użyjesz [[
zamiast tego [
, mimo że [[
jest słowem kluczowym powłoki (a nie wbudowanym), otrzymasz ten sam wynik, ponieważ niezamierzone połączenie ciągów znaków nadal zastępuje rozpoznawanie słowa kluczowego.
["$var"
jest składniowo poprawnym wyrażeniem nazwa-polecenia ; podobnie, tokeny ==
i "$string"
są poprawnymi argumentami polecenia . (Ogólnie, wbudowane [
jest analizowana z poleceń składni, podczas gdy [[
- w powłoce hasła - jest analizowana w inny sposób). Określenie wbudowane powłoki [
jest nie przekazywać do „ test
programu” (użyteczności zewnętrzna): bash
, dash
, ksh
, zsh
mają wbudowany wersje zarówno [
itest
i nie nazywają swoich odpowiedników narzędziami zewnętrznymi.
Czas zmienia wszystko. Oto strona internetowa, która zapewnia sprawdzanie składni online skryptu powłoki.
Odkryłem, że jest to bardzo potężne narzędzie do wykrywania typowych błędów.
ShellCheck to narzędzie do analizy statycznej i usuwania kłaczków dla skryptów sh / bash. Koncentruje się głównie na obsłudze typowych błędów składniowych i pułapek dla początkujących i średniozaawansowanych, w których powłoka po prostu wyświetla tajemniczy komunikat o błędzie lub dziwne zachowanie, ale raportuje także o kilku bardziej zaawansowanych problemach, w których przypadki narożne mogą powodować opóźnione awarie.
Kod źródłowy Haskell jest dostępny na GitHub!
apt-get install shellcheck
trusty-backports
.
Włączam również opcję „u” w każdym skrypcie bash, który piszę, aby wykonać dodatkowe sprawdzenie:
set -u
Spowoduje to zgłoszenie użycia niezainicjowanych zmiennych, jak w poniższym skrypcie „check_init.sh”
#!/bin/sh
set -u
message=hello
echo $mesage
Uruchamianie skryptu:
$ check_init.sh
Zgłasza następujące:
./check_init.sh[4]: mesage: Parametr nie został ustawiony.
Bardzo przydatne do łapania literówek
set -u
chociaż tak naprawdę nie odpowiada na pytanie, ponieważ musisz uruchomić skrypt, aby otrzymać komunikat o błędzie. Nawet nie bash -n check_init.sh
pokazuje tego ostrzeżenia
sh -n script-name
Uruchom to. Jeśli skrypt zawiera błędy składniowe, zwraca ten sam komunikat o błędzie. Jeśli nie ma żadnych błędów, wychodzi bez podania żadnej wiadomości. Możesz natychmiast sprawdzić za pomocą echo $?
, który zwróci 0
potwierdzenie bez powodzenia.
To działało dla mnie dobrze. Pracowałem na Linux OS, Bash Shell.
sh -n
prawdopodobnie nie sprawdzi, czy skrypt jest prawidłowym skryptem Bash. Może dawać fałszywe negatywy. sh
to wariant powłoki Bourne'a, który zwykle nie jest Bash. Na przykład w Ubuntu Linux realpath -e $(command -v sh)
daje / bin / dash
Właściwie sprawdzam wszystkie skrypty bash w bieżącym katalogu pod kątem błędów składniowych BEZ uruchamiania ich za pomocą find
narzędzia:
Przykład:
find . -name '*.sh' -exec bash -n {} \;
Jeśli chcesz go użyć do pojedynczego pliku, po prostu edytuj symbol wieloznaczny z nazwą pliku.
Istnieje wtyczka BashSupport dla IntelliJ IDEA, która sprawdza składnię.
.sh
skryptami Bash lub innym rozszerzeniem związanym z tym skryptem, co ma miejsce, jeśli generujesz skrypty za pomocą jakiegoś narzędzia szablonowego, takiego jak ERB (wtedy się kończą .erb
). Głosuj na youtrack.jetbrains.com/issue/IDEA-79574, jeśli chcesz to naprawić!
Jeśli potrzebujesz w zmiennej ważności wszystkich plików w katalogu (git pre-commit hook, build lint script), możesz złapać wyjście stderr komend „sh -n” lub „bash -n” (zobacz inne odpowiedzi) w zmiennej i na tej podstawie mieć „if / else”
bashErrLines=$(find bin/ -type f -name '*.sh' -exec sh -n {} \; 2>&1 > /dev/null)
if [ "$bashErrLines" != "" ]; then
# at least one sh file in the bin dir has a syntax error
echo $bashErrLines;
exit;
fi
Zmień „sh” na „bash” w zależności od potrzeb