আমি বাশ স্ক্রিপ্টটি না চালিয়ে সিনট্যাক্স কিভাবে করব?


267

কোনও বাশ স্ক্রিপ্ট সিনট্যাক্স কার্যকর না করে পরীক্ষা করা কি সম্ভব?

পার্ল ব্যবহার করে, আমি চালাতে পারি perl -c 'script name'। বাশ স্ক্রিপ্টগুলির জন্য কোনও সমমানের আদেশ আছে?


উত্তর:


380
bash -n scriptname

সম্ভবত একটি সুস্পষ্ট সতর্কবাণী: এটি সিনট্যাক্সকে বৈধ করে তবে আপনার ব্যাশ স্ক্রিপ্টটি কোনও আদেশের ech helloপরিবর্তে আপনার পথে নেই এমন আদেশটি কার্যকর করার চেষ্টা করে কিনা তা পরীক্ষা করে না echo hello


9
"শেল বিল্টিন কম্যান্ডস / সেট" এর অধীনে বাশের ম্যানপেজে, -এন নথিভুক্ত করা হয়েছে, এবং ম্যানপেজের সূচনা হিসাবে, ব্যাশ সমস্ত একক-অক্ষর বিকল্পগুলির ব্যাখ্যা setকরে যা এটি করে।
পূর্বসূরীর

24
(আমার জন্য) সুস্পষ্ট সতর্কবাণীতে যুক্ত করার জন্য, এটি if ["$var" == "string" ]পরিবর্তে কোনও হারিয়ে যাওয়া জায়গার কারণে কোনও ত্রুটি ধরা পড়বে নাif [ "$var" == "string" ]
ব্রায়ঞ্জার

11
@ ব্রিনজার কারণ এটি কেবল বাক্য গঠন পরীক্ষা করা। উন্মুক্ত বন্ধনী সিনট্যাক্স নয়, এটি সঞ্চালনের ক্রিয়াকলাপের নাম। type ["[এটি একটি শেল বিল্টিন") বলে। এটি শেষ পর্যন্ত testপ্রোগ্রামটিতে প্রতিনিধিত্ব করে তবে এটি একটি বন্ধনী বন্ধনীও আশা করে। সুতরাং এটি এর মতো if test"$var", যা লেখক বোঝাতে চেয়েছিলেন তা নয়, তবে সিন্টেক্সিকভাবে বৈধ (বলুন $ var এর "a" এর মান রয়েছে, তারপরে আমরা "বাশ: টেস্টা: কমান্ড খুঁজে পাইনি") দেখতে পাব। পয়েন্টটি হ'ল সিন্ট্যাক্টিকভাবে, কোনও অনুপস্থিত জায়গা নেই।
জোশুয়া গাল

2
@ জোশুয়া চিয়েক: খালি স্ট্রিংয়ে প্রসারিত হওয়ার [ক্ষেত্রে যদি বিল্টিনকে কেবল তখনই অনুরোধ করা $varহয় । যদি একটি খালি-খালি স্ট্রিংয়ে প্রসারিত হয় , তবে সেই স্ট্রিং দিয়ে সংশ্লেষিত হয় এবং বাশ দ্বারা একটি কমান্ড নাম ( ফাংশন নাম নয়) হিসাবে ব্যাখ্যা করা হয়, এবং হ্যাঁ, এটি সিন্টেক্সিকভাবে বৈধ, তবে আপনি যেমন বলেছিলেন , সম্ভবত উদ্দেশ্যটি নয়। আপনি ব্যবহার করেন তাহলে পরিবর্তে , যদিও একটি শেল হল শব্দ (বরং একটি builtin চেয়ে), আপনি কারণ অনিচ্ছাকৃত স্ট্রিং সংযুক্তকরণের এখনও শব্দ স্বীকৃতি অগ্রাহ্য, একই ফলাফল পাবেন। $var[[[[[[
এমকেলেট 0

2
@JoshuaCheek: ব্যাশ এখনও সিনট্যাক্স এখানে -checking: এটা চেক এর সহজ-কমান্ড আবাহন শব্দবিন্যাস: ["$var"হয় চিহ্নগুলি সিন্টেক্সের একটি বৈধ কম্যান্ড-নাম অভিব্যক্তি; একইভাবে, টোকেনগুলি ==এবং "$string"বৈধ কমান্ড আর্গুমেন্ট । (সাধারণত, builtin [সঙ্গে পার্স করা হয় কমান্ড , সিনট্যাক্স যেহেতু [[- একটি শেল হিসাবে শব্দ - ভিন্নভাবে পার্স হয়।) শেল builtin [নেই না প্রতিনিধিত্ব "করতে testপ্রোগ্রাম" (বহিরাগত উপযোগ): bash, dash, ksh, zshসব আছে builtin উভয়ের সংস্করণ [এবংtest, এবং তারা তাদের বাহ্যিক-ইউটিলিটি অংশগুলিকে কল করে না
mklement0

127

সময় সবকিছু বদলে দেয়। এখানে এমন একটি ওয়েবসাইট রয়েছে যা শেল স্ক্রিপ্টের জন্য অনলাইন সিনট্যাক্স চেক সরবরাহ করে।

আমি দেখতে পেয়েছি এটি সাধারণ ত্রুটিগুলি সনাক্ত করা খুব শক্তিশালী।

এখানে চিত্র বর্ণনা লিখুন

শেলচেক সম্পর্কে

শেলচেক sh / বাশ স্ক্রিপ্টগুলির জন্য একটি স্থিতিশীল বিশ্লেষণ এবং আবদ্ধকরণ সরঞ্জাম। এটি মূলত সাধারণ প্রাথমিক এবং মধ্যবর্তী স্তরের সিনট্যাক্স ত্রুটিগুলি এবং সমস্যাগুলি পরিচালনা করার দিকে দৃষ্টি নিবদ্ধ করে যেখানে শেলটি কেবল একটি ক্রিপ্টিক ত্রুটি বার্তা বা অদ্ভুত আচরণ দেয় তবে এটি আরও কয়েকটি উন্নত ইস্যুতে রিপোর্ট করে যেখানে কোণার ক্ষেত্রে বিলম্বিত ব্যর্থতার কারণ হতে পারে।

হাসিটেল সোর্স কোডটি গিটহাবে পাওয়া যায়!


5
দুর্দান্ত টিপ; উপর ওএসএক্স আপনি এখন shellcheck.net CLI ইনস্টল করতে পারেন, shellcheckমাধ্যমে Homebrew : brew install shellcheck
mklement0

3
এছাড়াও ডেবিয়ান এবং বন্ধুদের:apt-get install shellcheck
যে অন্য লোক

উবুন্টু বিশ্বাসের জন্য এই প্যাকেজটি অবশ্যই ইনস্টল করা উচিত trusty-backports
পিটারিনো

উপরে উল্লিখিত হিসাবে, নির্ভরযোগ্য নির্ভরতা প্রয়োজন, এবং এটি উবুন্টুতে নীচে হিসাবে ইনস্টল করতে পারেন 14.04: sudo apt-get -f ইনস্টল করুন, তারপরে: sudo sudo apt-get ইনস্টল শেলচেক করুন
zhihong

এটি সত্যই কার্যকর, তবে এটি বাশের পার্সারটি ব্যবহার করে না তবে এটির নিজস্ব। বেশিরভাগ ক্ষেত্রে এটি যথেষ্ট ভাল এবং এটি পার্সিং এবং অন্যান্য সমস্যা উভয়ই সনাক্ত করতে পারে তবে কমপক্ষে একটি কিনার মামলা রয়েছে (এবং সম্ভবত অন্যান্যরাও আমি দেখিনি) যেখানে এটি একইভাবে পার্স করে না।
ড্যানিয়েল এইচ

38

কিছু অতিরিক্ত চেক করার জন্য আমি লিখি প্রতিটি বাশ স্ক্রিপ্টে 'ইউ' বিকল্পটি সক্ষম করে:

set -u 

এটি নিম্নলিখিত স্ক্রিপ্টের মতো 'চেক_ইনিট.শ' এর মতো অবিচ্ছিন্ন ভেরিয়েবলগুলির ব্যবহারের প্রতিবেদন করবে

#!/bin/sh
set -u
message=hello
echo $mesage

স্ক্রিপ্ট চলছে:

$ check_init.sh

নিম্নলিখিত রিপোর্ট করবেন:

./check_init.shmitted4]: ম্যাসেজ: প্যারামিটার সেট করা নেই।

টাইপগুলি ধরার জন্য খুব দরকারী


4
আমি এই পতাকাগুলি সর্বদা আমার বাশ স্ক্রিপ্টগুলিতে সেট করি, এটি যদি পাস হয়ে যায় তবে "সেট-ও এররেসিট" "সেট-ন নাম সেট" "সেট-ও পাইপফেইল"
λαβέ.λαβέ

জন্য +1 set -uযদিও এই সত্যিই, প্রশ্নের উত্তর না কারণ আপনি ত্রুটি বার্তা পেতে স্ক্রিপ্ট চালানোর আছে। এমনকি bash -n check_init.shসেই সতর্কতাটিও দেখায় না
rubo77

23
sh  -n   script-name 

এই চালান। স্ক্রিপ্টে যদি কোনও সিনট্যাক্স ত্রুটি থাকে তবে এটি একই ত্রুটি বার্তাটি দেয়। যদি কোনও ত্রুটি না থাকে তবে কোনও বার্তা না দিয়েই তা বেরিয়ে আসে। আপনি ব্যবহার করে তত্ক্ষণাত্ পরীক্ষা করতে পারেন echo $?, যা ফিরে আসবে0 কোনও ভুল ছাড়াই সফলতার সাথে নিশ্চিত হয়ে ।

এটা আমার জন্য ভাল কাজ করে। আমি লিনাক্স ওএস, বাশ শেলের উপর দৌড়েছি।


1
যদিও বাশ সিনট্যাক্স চেকের সাথে ঠিক সম্পর্কিত নয় - সম্পূর্ণ স্ক্রিপ্ট বা স্ক্রিপ্টের অংশগুলি ডিবাগ করার জন্য সেট-এক্স এবং সেট + এক্স ব্যবহার করা বেশ কার্যকর
গুরুম

ধন্যবাদ এর জন্য জানতাম না-তবে তবে আমি যা চেয়েছিলাম তা হ'ল গুরুম> শ-এক্স টেস্ট.শ যা স্ক্রিপ্টটির উত্পন্ন আউটপুট প্রদর্শন করে
জাজাপার

1
হ্যাঁ. আমি উল্লেখ করতে ভুলে গেছি যে আপনি নিম্নলিখিত কমান্ড লাইনে এটি করতে পারেন: 1) বাশ-এক্স পরীক্ষা.শ # এটি পুরো স্ক্রিপ্টটি 'ডিবাগ মোডে' 2) সেট + x এ চালায়; bash test.sh; স্ক্রিপ্ট চলার আগে / পরে / x সেট সেট-ডিবেগ মোড চালু / বন্ধ স্ক্রিপ্টে: ক) #! / বিন / বাশ -x # স্ক্রিপ্টের শীর্ষে 'ডিবাগ মোড' সেট করুন + এক্স; কোড; স্ক্রিপ্টের যে কোনও বিভাগের জন্য -x # এডিডি 'ডিবাগ মোড'
গুরুএম

sh -nসম্ভবত স্ক্রিপ্টটি বৈধ বাশ স্ক্রিপ্ট কিনা তা পরীক্ষা করবে না। এটি মিথ্যা নেতিবাচক দিতে পারে। shকিছু বোর্ন শেল বৈকল্পিক যা সাধারণত বাশ নয়। উদাহরণস্বরূপ উবুন্টু লিনাক্সে realpath -e $(command -v sh)/ বিন / ড্যাশ দেয়
-19

4

findটুল ব্যবহার করে চালিয়ে ব্যতীত সিনট্যাক্স ত্রুটির জন্য আমি বর্তমান দির সমস্ত বাশ স্ক্রিপ্টগুলি পরীক্ষা করে দেখি :

উদাহরণ:

find . -name '*.sh' -exec bash -n {} \;

আপনি যদি এটি কোনও একক ফাইলের জন্য ব্যবহার করতে চান তবে কেবল ফাইলের নাম সহ ওয়াইল্ডকার্ড সম্পাদনা করুন।


3

ভেরিয়েবলের মান দেখতে ডিবাগ করার সময় নাল কমান্ড [কোলন] দরকারী

set -x
for i in {1..10}; do
    let i=i+1
    : i=$i
done
set - 

এটি প্যারামিটার বিস্তৃতি ব্যবহার করে
mug896

এটি কাজ করে, কারণ set -xপ্রতিটি লাইন কার্যকর করার আগে এটি দেখায়
রুও 7777

1

নেই BashSupport প্লাগইন জন্য IntelliJ আইডিয়া যা চেক সিনট্যাক্স।


তবে আপনার ফাইলগুলি .shবাশ স্ক্রিপ্টগুলির সাথে সম্পর্কিত বা অন্য এক্সটেনশনের সাথে না শেষ হলে এটি কাজ করবে না , আপনি যদি ইআরবির মতো কিছু টেম্প্লেটিং সরঞ্জাম ব্যবহার করে স্ক্রিপ্টগুলি তৈরি করেন তবে ক্ষেত্রে এটি হয় (তারপরে সেগুলি শেষ হয় .erb)। আপনি যদি এটি স্থির করতে চান তবে দয়া করে youtrack.jetbrains.com/issue/IDEA-79574 এর জন্য ভোট দিন !
গ্রেগ দুবিকি

1

আপনার যদি কোনও ভেরিয়েবলের মধ্যে ডিরেক্টরিতে সমস্ত ফাইলের বৈধতা প্রয়োজন (গিট প্রি-কমিট হুক তৈরি করুন, লিঙ্ক লিপি স্ক্রিপ্ট), আপনি "sh -n" বা "bash -n" কমান্ডের স্টডার আউটপুট ধরতে পারেন (অন্যান্য দেখুন উত্তরগুলি) একটি চলকতে এবং তার উপর ভিত্তি করে "যদি / অন্য" থাকে "

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

আপনার প্রয়োজনের উপর নির্ভর করে "বাশ" দিয়ে "sh" পরিবর্তন করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.