Bir bash betiği sözdizimini yürütmeden kontrol etmek mümkün mü?
Perl kullanarak koşabilirim perl -c 'script name'
. Bash komut dosyaları için eşdeğer bir komut var mı?
Bir bash betiği sözdizimini yürütmeden kontrol etmek mümkün mü?
Perl kullanarak koşabilirim perl -c 'script name'
. Bash komut dosyaları için eşdeğer bir komut var mı?
Yanıtlar:
bash -n scriptname
Belki bariz bir uyarı: Bu geçerli kılınarak sözdizimi ancak bash komut çalışır gibi, yoldaki olmayan bir komutu çalıştırmak için kontrol olmayacaktır ech hello
yerine echo hello
.
set
.
if ["$var" == "string" ]
bunun yerine eksik bir alanın neden olduğu bir hatayı yakalamazif [ "$var" == "string" ]
type [
"[bir kabuk yerleşiktir” der. Sonunda test
programa delege eder , ancak bir kapanış parantezini de bekler. Yani bu if test"$var"
, yazarın kastettiği gibi değil, sözdizimsel olarak geçerlidir ($ var'ın "a" değerine sahip olduğunu varsayalım, o zaman "bash: testa: command not found"). Mesele şu, sözdizimsel olarak, eksik alan yoktur.
[
yalnızca bu durumda boş bir dizeye$var
genişletilirse çağrılır . Eğer bir karşı genişleyeceği boş olmayan dize, bir birleştirilmiş bu dize ile ve bir olarak yorumlanır komut adı (değil işlevi olan Bash, ve, evet, tarafından adı) sözdizimsel belli ki devlet olarak, niyet geçerli değildir, ancak. Eğer kullanırsanız yerine , olsa bile bir kabuk anahtar kelime (yerine bir yerleşiğine yerine) istenmeyen bir dizge birleştirme hala anahtar kelimenin tanınmasını geçersiz kılar, çünkü, aynı sonucu elde edersiniz. $var
[
[[
[
[[
["$var"
olan sözdizimsel geçerli bir komut adı ifadesi; benzer şekilde, jetonlar ==
ve "$string"
geçerli komut bağımsız değişkenleridir . (Genel olarak, yerleşik [
ile ayrıştırılır komut ise, söz dizimi [[
- bir kabuk olarak anahtar kelime - farklı ayrıştırılır.) Kabuk yerleşik [
etmez olmayan temsilci "için test
bir program" (dış faydalı) bash
, dash
, ksh
, zsh
her şeye sahip yerleşik hem de alternatifler [
vetest
Ve onlar yapmak değilharici yardımcı meslektaşlarını arayın.
Zaman her şeyi değiştirir. İşte bir web sitesi kabuk betiği için çevrimiçi sözdizimi denetimi sağlayan .
Sık karşılaşılan hataları algılamanın çok güçlü olduğunu gördüm.
ShellCheck sh / bash betikleri için statik bir analiz ve linting aracıdır. Temel olarak, kabuğun sadece şifreli bir hata mesajı veya garip davranış verdiği tipik başlangıç ve orta düzey sözdizimi hatalarını ve tuzaklarını ele almaya odaklanır, ancak köşe vakalarının gecikmiş hatalara neden olabileceği birkaç daha gelişmiş sorunu da bildirir.
Haskell kaynak kodu GitHub'da!
apt-get install shellcheck
trusty-backports
.
Ayrıca, bazı ekstra kontroller yapmak için yazdığım her bash betiğinde 'u' seçeneğini etkinleştiriyorum:
set -u
Bu, şu komut dosyasında olduğu gibi başlatılmamış değişkenlerin kullanımını bildirir. 'Check_init.sh'
#!/bin/sh
set -u
message=hello
echo $mesage
Komut dosyasını çalıştırma:
$ check_init.sh
Aşağıdakileri rapor edecektir:
./check_init.sh[4]: mesage: Parametre ayarlanmadı.
Yazım hatalarını yakalamak için çok yararlı
set -u
Hata iletisini almak için komut dosyasını çalıştırmanız gerektiğinden, bu soruyu gerçekten yanıtlamasa da +1 . bash -n check_init.sh
Bu uyarıyı bile göstermiyor
sh -n script-name
Bunu çalıştırın. Kodda herhangi bir sözdizimi hatası varsa, aynı hata iletisini döndürür. Hata yoksa, herhangi bir mesaj vermeden ortaya çıkar. Kullanarak hemen kontrol edebilirsiniz echo $?
, bu da 0
başarılı bir şekilde onaylamayı herhangi bir hata yapmadan geri döndürür .
Benim için iyi çalıştı. Linux işletim sistemi, Bash Shell üzerinde çalıştım.
sh -n
muhtemelen betiğin geçerli Bash betiği olup olmadığını kontrol etmez. Yanlış negatifler verebilir. sh
genellikle Bash olmayan bazı Bourne kabuğu varyantıdır. Örneğin Ubuntu Linux'tarealpath -e $(command -v sh)
/ bin / dash
Aslında find
aracı kullanarak çalıştırmadan OLMADAN sözdizimi hataları için geçerli dir tüm bash komut dosyaları kontrol :
Misal:
find . -name '*.sh' -exec bash -n {} \;
Tek bir dosya için kullanmak istiyorsanız, joker karakteri dosyanın adıyla düzenleyin.
Orada BashSupport eklentisi için IntelliJ IDEA hangi kontroller sözdizimi.
.sh
Bash komut dosyalarıyla ilişkili değilse veya başka bir uzantıyla çalışmazsa çalışmaz , bu da komut dosyalarını ERB gibi bir şablon aracı kullanarak oluşturursanız (daha sonra biter .erb
). Düzeltilmesini istiyorsanız lütfen youtrack.jetbrains.com/issue/IDEA-79574 için oy verin !
Bir dizindeki tüm dosyaların geçerliliğine ihtiyacınız varsa (git pre-commit hook, build lint script), "sh -n" veya "bash -n" komutlarının stderr çıktısını yakalayabilirsiniz (diğerlerine bakın) cevaplar) bir değişkeni kullanın ve buna dayalı bir "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
İhtiyaçlarınıza göre "sh" i "bash" ile değiştirin