تكنولوجيا

استخدم shellcheck للبحث عن أخطاء البرنامج النصي وإصلاحها – CloudSavvy IT

شترستوك / ماركوفكتور

يعد Shellcheck أداة ممتازة لتحليل البرامج النصية لنظام Linux Shell ، والتي يمكن استخدامها لاكتشاف أخطاء البرمجة الشائعة. يحلل Shellcheck البرنامج النصي ويبلغ عن الأخطاء والتحذيرات ، على غرار ما سيفعله المترجم.

ما هو فحص شل؟

إذا كنت مطور Linux Bash لبعض الوقت ، فربما تكون قد وجدت الكثير من الأخطاء في البرامج النصية الخاصة بك أو البرامج النصية الأخرى. عندما يطور البشر رمزًا ، يجب عليهم إدخال أخطاء في الكود. حتى أفضل المطورين قد يفوتهم أحيانًا تعقيدات أو تحذيرات غير متوقعة في التعليمات البرمجية الخاصة بهم.

في Bash ، لا يوجد مترجم حقيقي ، على سبيل المثال في C ++. ومع ذلك ، هناك مجموعة من الأدوات التي يمكن أن تساعد كثيرًا عند تطوير البرامج النصية Bash. بمجرد أن تصبح هذه الأداة هي shellcheck. ستعمل هذه الأداة الرائعة على تحليل ملف البرنامج النصي Bash وتقديم توصيات بناءً على المحتوى الموجود أثناء التحليل. إنه يشبه إلى حد ما مترجم Bash.

تختلف الأدوات مثل shellcheck عن أدوات وقت التشغيل الأخرى قيد التشغيل ، على سبيل المثال ، استخدام bash -x اعرض كل أمر يتم تنفيذه في البرنامج النصي في الوقت الفعلي. والسبب هو أن shellcheck سيحلل البرنامج النصي (الملف) دون تنفيذه فعليًا ، وهو ما يشبه ما سيفعله المترجم.

للمزيد من المعلومات bash -x، قد ترغب في قراءة أساسيات Bash Automation and Scripting (الجزء 3) ، والتي تعد جزءًا من سلسلة مكونة من 3 أجزاء حول أساسيات البرمجة النصية وأتمتة Bash.

التثبيت فحص شل

تثبيت فحص شل في توزيعات Linux التي تستند إلى Debian / Apt (مثل Ubuntu و Mint) ، نفِّذ الأوامر التالية على الجهاز:

sudo apt set up shellcheck

تثبيت فحص شل في توزيعات Linux التي تستند إلى RedHat / Yum (مثل RHEL و Centos و Fedora) ، قم بتنفيذ الأوامر التالية في الجهاز:

sudo yum set up shellcheck

يركض فحص شل

بعد تثبيت shellcheck ، يمكننا استخدام البرنامج النصي المعطل للاختبار البسيط.أولاً ، نحدد البرنامج النصي examination.sh كما يلي:

#!  / bin / clean echo "إذا لم يكن Bash أو Clean echo ، فسيكون هناك المزيد من الأخطاء بالنسبة لي" [ -d ./directory }; than
  echo 'sure! < start
fif


How many bugs can you find? (Tip: there are 8!).

Let’s next see what shellcheck makes of this code:

shellcheck test.sh

Shellcheck output 1

Immediately on the first line it finds an issue with the shebang specification. If you haven’t heard of shebang yet, please checkout our Bash Automation and Scripting Basics Part 1 article. Our pun shebang line #!/bin/wash should be #!/bin/bash. Let’s fix this. Issue 1/8 fixed!

We will also at the same time fix the other two issues immediately recognized by shellcheck: Did you forget to close this single quoted string? for the second line: spot on! Issue 2/8 fixed. For the third issue there is a little confusion as to our/the developers intent for shellcheck, and this is to be expected, as the ' on line 2 opens a string which is only terminated on line 5 when another ' is seen!

As this third issue is thus a result of the second issue, this run will allow us to fix two issues for the time being. Our script now looks like this:

#!/bin/bash
echo 'Bash is not wash'
echo More errors for me"
if [ -d ./directory }; than
  echo 'sure! < start
fif


Let’s run shellcheck on this again after making the corrections and see what the output is.

Shellcheck output 2

In this instance, shellcheck sees that a " is opened on line 3 (even though it is at the end of the line, it is actually an opening double quote as such), and that even at script end (note the line 8 indication, which does not exist in our 6-line script with a single empty line after the last line. Let’s clean up this empty line, and fix the double quoting issue at the start of line 3, which can now be readily understood. Issue 3/8 fixed!

Our script now looks like this:

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
if [ -d ./directory }; than
  echo 'sure! < start
fif

Re-running shellcheck (note how similar again these steps are to using a compiler in other coding languages):

Bash shellcheck output 3

Could not be clearer; The mentioned syntax error was in this if expression and Expected test to end here. We shall do as suggested and change the } to ]لجعل الخط يقرأ if [ -d ./directory ] than. تم إصلاح المشكلة 4/8! قمنا بتشغيل shellcheck مرة أخرى ونرى الآن ما يلي:

إخراج shellcheck 4

مشكلة اقتباس واحدة أخرى. نحن نعلم بالفعل كيفية حل هذه المشاكل.دعونا نتغير echo 'sure! < start إلى echo 'sure!' < start (تم إصلاح المشكلة 5/8!) ، ثم قم بتشغيل shellcheck مرة أخرى:

إخراج Shellcheck 5

أول شيء مثير للاهتمام هو أننا نرى أن shellcheck لا يمكنه تحليل السطر.على الرغم من أن هذا يبدو وكأنه عيب في shellcheck ، إلا أننا سنجد المزيد من القراءة then لقد ذهب. آها!نضع than بدلا من then. يا له من خطأ مهمل - سهل الإصلاح (تم إصلاح المشكلة 6/8!). يبدو البرنامج النصي الخاص بنا الآن كما يلي:

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
if [ -d ./directory ] then
  echo 'sure!' < start&#13
fif&#13

يوفر لنا تشغيل آخر لـ shellcheck معلومة أخرى مفيدة:

إخراج Shellcheck 6

نحن مفقودون fi! اها نعم fif مستحيل.نحن نتغير fif إلى fi إصلاح في السطر الأخير من البرنامج النصي (الإصدار 7/8) وتشغيل shellcheck مرة أخرى!

إخراج Shellcheck 7

مشكلة إعادة التوجيه.بصراحة لم أتوقع shellcheck طرح هذا الخطأ أيضًا ، لأن < يمكن استخدامه أيضًا في Bash ، لكنه كذلك.في الواقع ، تم تصميم إعادة التوجيه لدينا ل > بدلا من <. الإصدار 8/8-تم إصلاح جميع المشكلات!هذا يقودنا إلى السيناريو النهائي

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
if [ -d ./directory ] then
  echo 'sure!'> get started
fi

دعونا نرى كيف يراه shellcheck الآن.

إخراج Shellcheck 8

في احسن الاحوال! منذ التنفيذ الأول ، يعمل البرنامج النصي بشكل مثالي.

إذا نظرت إلى مخرجات أوامر shellcheck المختلفة ، ستلاحظ أيضًا ميزة أخرى ملائمة جدًا لـ shellcheck ، خاصة للمبتدئين: يتم عرض مجموعة من الارتباطات التشعبية (روابط مواقع الويب) ، ويمكنك النقر فوق هذه الارتباطات التشعبية في النافذة الطرفية ، أو حدد (إذا لزم الأمر)> انقر بزر الماوس الأيمن للنسخ واللصق في المتصفح. سيؤدي النقر فوق هذه الروابط إلى نقلك إلى مشروع shellcheck GitHub.

في عجلة من امرنا؟

إذا كنت تريد فقط التحقق بسرعة من الخيارات الأكثر أهمية ، فقد ترغب في التحقق --severity=SEVERITY الخيار ، حيث ستحل محل SEVERITY مع واحد من error, warning, info, style.

لذلك أنت تبحث فقط عن الأخطاء والتحذيرات ، يمكنك استخدامها --severity=warning (بما في ذلك المستويات الأعلى ، في هذه الحالة ، mistake) كخيار shellcheck.

يتم إحتوائه

إذا لم تكن هناك مشكلة في المنطق في البرنامج النصي ، فيرجى تشغيل shellcheck قبل تنفيذ البرنامج النصي وإصلاح جميع المشكلات المرئية ، سيضمن تشغيله بشكل مثالي عند التشغيل الأول. يمكنك حتى استخدام shellcheck للتعامل مع تحديات الترميز في مقابلة Bash coding المباشرة التالية!في هذه المقالة ، استكشفنا العديد من المشكلات التي قد تظهر في البرنامج النصي وكيفية حلها shellcheck تعامل معهم.

استمتع بالبرامج النصية الخالية من الأخطاء!

مقالات ذات صلة

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى