লাইনে কীভাবে বাশ স্ক্রিপ্ট লাইন চালানো হয়?


96

আমি যদি বাশ-এক্স বিকল্পটি প্রবেশ করি তবে এটি সমস্ত লাইন প্রদর্শন করবে। তবে স্ক্রিপ্টটি সাধারণভাবে কার্যকর করবে।

আমি কীভাবে রেখার দ্বারা লাইন চালাতে পারি? এটি সঠিক কাজটি করে কিনা তা আমি দেখতে পাচ্ছি বা আমি বাগটি বাতিল এবং ঠিক করেছি। একই প্রভাব readপ্রতিটি লাইনে একটি করা হয়।


4
সম্ভবত আরো বিস্তৃতভাবে দেখতে stackoverflow.com/questions/951336/how-to-debug-a-bash-script/...
tripleee

উত্তর:


130

আপনার প্রতিটি লাইনে একটি পঠন লাগবে না, কেবল আপনার বাশ স্ক্রিপ্টে নীচের মতো একটি ফাঁদ যুক্ত করুন, এটি আপনার পছন্দসই প্রভাব ফেলেছে, যেমন।

#!/usr/bin/env bash
set -x
trap read debug

< YOUR CODE HERE >

কাজ করে, এটি কেবল bash v4.2.8 এবং v3.2.25 দিয়ে পরীক্ষা করেছে।


উন্নত সংস্করণ

যদি আপনার স্ক্রিপ্ট ফাইলগুলি থেকে সামগ্রী পড়ছে তবে উপরের তালিকাভুক্ত কাজ করবে না। একটি workaround নিম্নলিখিত উদাহরণ মত দেখতে পারে।

#!/usr/bin/env bash
echo "Press CTRL+C to proceed."
trap "pkill -f 'sleep 1h'" INT
trap "set +x ; sleep 1h ; set -x" DEBUG

< YOUR CODE HERE >

স্ক্রিপ্টটি থামাতে আপনাকে এ ক্ষেত্রে অন্য শেল থেকে এটি হত্যা করতে হবে ।


বিকল্প 1

আপনার স্ক্রিপ্টের পরবর্তী কমান্ডে যাওয়ার আগে আপনি যদি কেবল কয়েক সেকেন্ড অপেক্ষা করতে চান তবে নীচের উদাহরণটি আপনার জন্য কাজ করতে পারে।

#!/usr/bin/env bash
trap "set +x; sleep 5; set -x" DEBUG

< YOUR CODE HERE >

আউটপুট আরও পঠনযোগ্য করার জন্য ট্র্যাপ কমান্ডের মধ্যে আমি সেট + x এবং সেট -x যুক্ত করছি।


4
তারপরে আপনি কীভাবে পরবর্তী লাইনে পা রাখবেন (পরবর্তী কমান্ডটি চালান)?
ডেভিড ডরিয়া

4
এটি প্রতিটি কমান্ডের একটি পঠনকে ফাঁদে ফেলে। কেবলমাত্র আপনাকে যা করতে হবে তা হল পরবর্তী কমান্ডটি পেতে ফিরে টিপুন
জৈব-ম্যাসআপ

4
আপনার যদি "লাইনের পাঠের সময় এই জাতীয় কমান্ড লাইন থাকে; প্রতিধ্বনি $ লাইনটি করুন; সম্পন্ন <<< কিছু করুন" method পদ্ধতিটি কাজ করে না কারণ "ফাঁদ পড়ুন
ডিইবিইউজি

4
আপনি কীভাবে এটি বন্ধ করবেন? আমি স্ক্রিপ্টটি শেষ পর্যন্ত পা দেওয়ার পরে, শেলটি স্ক্রিপ্টের মতো এখনও কাজ করে।
স্ল্যাশডটটিয়ার

4
trap 'read -u1' debugপুনর্নির্দেশ সমস্যা রিডিং ফাইল ওভাররাইডে পরিবর্তন করুন ।
ব্যবহারকারী3132194

23

সম্ভবত বেস ডিবাগারটি আপনার জন্য কিছু।


4
এটি সত্যই সেরা সমাধান। এটি চালানোর আগে লাইনটি দেখার অনুমতি দেয় (এবং আরও অনেক কিছু)। বেশিরভাগ সিস্টেমে এটি ইনস্টল করা যেতে পারে apt-get install bashdb। তারপরে আপনাকে কেবল চালানো bashdb your_command.sh, টাইপ করতে হবে stepএবং তারপরে তার পরে গাড়িতে ফিরে আসা দরকার hit
স্টুডিজ

4
@ স্টুডিজিক এটি রেডহাট / সেন্টোস ইত্যাদিতে উপলভ্য নয় তাই আমি এটিকে "বেশিরভাগ সিস্টেম" বলব না।
সাজুউক

@ সাজুক, এটি প্যাকেজভুক্ত নাও হতে পারে তবে এটি একেবারে উপলভ্য
চার্লস ডাফি 21

ম্যাকোস:brew install bashdb
বোনিব

@ চার্লসডুফি: এটি ডিফল্ট উবুন্টু রেপোসে নেই।
ড্যান ড্যাসক্লেস্কু

2

যদি আপনার বাশ স্ক্রিপ্টটি সত্যিই অফ কমান্ডগুলির একগুচ্ছ হয় যা আপনি একে একে চালাতে চান তবে আপনি এটির মতো কিছু করতে পারেন যা আপনি চলমান LNযে লাইন নম্বরটির সাথে মিল রেখে চলক বর্ধন করার সময় প্রতিটি কমান্ডকে একের পর এক চালায় you । এটি আপনাকে শেষ কমান্ডটি আবারও সুপার ইজি চালাতে দেয় এবং তারপরে পরবর্তী কমান্ডে যাওয়ার জন্য আপনি ভেরিয়েবলটি বাড়িয়ে তোলেন।

ধরে নিই যে আপনার কমান্ডগুলি কোনও ফাইল "it.sh" এ রয়েছে, নিম্নলিখিতগুলি একের পর এক চালান।

$ cat it.sh
echo "hi there"
date
ls -la /etc/passwd

$ $(LN=1 && cat it.sh | head -n$LN | tail -n1)
"hi there"

$ $(LN=2 && cat it.sh | head -n$LN | tail -n1)
Wed Feb 28 10:58:52 AST 2018

$ $(LN=3 && cat it.sh | head -n$LN | tail -n1)
-rw-r--r-- 1 root wheel 6774 Oct 2 21:29 /etc/passwd


1

xargs: লাইন ফিল্টার করতে পারেন

cat .bashrc | xargs -0 -l -d \\n bash
  • -0 কাঁচা ইনপুট হিসাবে আচরণ (কোন অব্যাহতি নেই)
  • -l প্রতিটি লাইন আলাদা করুন (পারফরম্যান্সের জন্য ডিফল্টরূপে নয়)
  • -d। n লাইন বিভাজক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.