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 helloyerine 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 testprograma 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 testbir program" (dış faydalı) bash, dash, ksh, zshher şeye sahip yerleşik hem de alternatifler [vetestVe 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 -uHata 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.shBu 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 0baş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 -nmuhtemelen betiğin geçerli Bash betiği olup olmadığını kontrol etmez. Yanlış negatifler verebilir. shgenellikle Bash olmayan bazı Bourne kabuğu varyantıdır. Örneğin Ubuntu Linux'tarealpath -e $(command -v sh) / bin / dash
Aslında findaracı 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.
.shBash 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