ДоступСн ShellCheck 0.9, статичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для shell-скриптов

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ выпуск ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ShellCheck 0.9, Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ систСму статичСского Π°Π½Π°Π»ΠΈΠ·Π° shell-скриптов, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΡƒΡŽ выявлСниС ошибок Π² скриптах с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ особСнностСй bash, sh, ksh ΠΈ dash. Код ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° написан Π½Π° языкС Haskell ΠΈ распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ GPLv3. ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с Vim, Emacs, VSCode, Sublime, Atom ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ срСдами, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ GCC-совмСстимый Π²Ρ‹Π²ΠΎΠ΄ свСдСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ….

ДоступСн ShellCheck 0.9, статичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для shell-скриптов

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ΡΡ выявлСниС Π² ΠΊΠΎΠ΄Π΅ ΠΊΠ°ΠΊ синтаксичСских ошибок, приводящих ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ ошибки Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ выполнСния, Ρ‚Π°ΠΊ ΠΈ сСмантичСских ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ΡΡ, Π½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ Π² ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ скрипта. Анализатор Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΡƒΠ·ΠΊΠΈΠ΅ мСста, Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ сбоям ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌ стСчСнии ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π².

Из классов выявляСмых ошибок ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с экранированиСм спСцсимволов ΠΈ ΠΎΠ±Ρ€Π°ΠΌΠ»Π΅Π½ΠΈΠ΅ΠΌ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ, ошибки Π² условных выраТСниях, Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ΅ использованиС ΠΊΠΎΠΌΠ°Π½Π΄, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π΄Π°Ρ‚, ΠΈ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Π΅ синтаксичСскиС ошибки Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ². НапримСр, отсутствиС ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² ΠΏΡ€ΠΈ сравнСнии «[[ $foo==0 ]]», Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² «var = 42» ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ символа $ ΠΏΡ€ΠΈ присвоСнии «$foo=42», использованиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π±Π΅Π· ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ «echo $1», ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π»ΠΈΡˆΠ½ΠΈΡ… ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобок Π² «tr -cd ‘[a-zA-Z0-9]'»,

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ поддСрТиваСтся Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ ΠΏΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡŽ стиля ΠΊΠΎΠ΄Π°, ΡƒΡΡ‚Ρ€Π°Π½Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡŽ надёТности Ρ€Π°Π±ΠΎΡ‚Ρ‹ скриптов. НапримСр, вмСсто «echo $[1+2]» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис «$((..))», конструкция ‘rm -rf «$STEAMROOT/»*’ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π° ΠΊΠ°ΠΊ нСбСзопасная ΠΈ способная ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΏΡ€ΠΈ Π½Π΅Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $STEAMROOT, Π° использованиС «echo {1..10}» Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ ΠΊΠ°ΠΊ нСсовмСстимоС с dash ΠΈ sh.

Π’ Π½ΠΎΠ²ΠΎΠΉ вСрсии:

  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ для Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π²ΠΈΠ΄Π° ‘local readonly foo’.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎ нСдоступности ΠΊΠΎΠΌΠ°Π½Π΄.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Ρ… ссылках Π² ‘declare x=1 y=$x’.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Ссли $? ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π΄Π°Ρ‡ΠΈ ΠΊΠΎΠ΄Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° echo, printf, [ ], [[ ]] ΠΈ test.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° рСкомСндация ΠΏΠΎ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ ((..))inarray[((idx))]=val.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° рСкомСндация ΠΏΠΎ объСдинСнию Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… скобок Π² арифмСтичСских контСкстах.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° рСкомСндация ΠΏΠΎ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ a[(x+1)]=val.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru