সঙ্গে bash
4.1 এবং, আপনি কি করতে পারেন
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(যখন bash
আহ্বান করা হয় তখনও কাজ করেsh
)।
মূলত, আমরা 2-এর ডিফল্ট পরিবর্তে ফাইল বর্ণনাকারী 7 bash
এ xtrace
আউটপুট আউটপুট দিতে বলছি এবং সেই ফাইল বিবরণীতে পুনঃনির্দেশিত করব /dev/null
। এফডি সংখ্যাটি নির্বিচারে। 2 এর উপরে একটি এফডি ব্যবহার করুন যা অন্যথায় আপনার স্ক্রিপ্টে ব্যবহৃত হয় না। আপনি যে কমান্ডটি এই কমান্ডটি প্রবেশ করিয়ে দিচ্ছেন তা যদি হয় bash
বা yash
আপনি 9 এর উপরে একটি সংখ্যাও ব্যবহার করতে পারেন (যদিও শেল দ্বারা ফাইলের বর্ণনাকারী অভ্যন্তরীণভাবে ব্যবহার করা থাকলে আপনি সমস্যা হতে পারে)।
আপনি যে bash
স্কেলটি থেকে যে স্কেলটি কল করছেন সেটি যদি হয় তবে আপনি এটি zsh
করতেও পারেন:
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
ভেরিয়েবলটি স্বয়ংক্রিয়ভাবে 9 এর উপরে প্রথম বিনামূল্যে এফডি নির্ধারণ করা হবে।
পুরানো সংস্করণগুলির জন্য bash
, অন্য বিকল্পটি যদি xtrace
চালু হয় set -x
(এর বিপরীতে #! /bin/bash -x
বা এর সাথে set -o xtrace
) চালু করা হয় set
তখন রফতানি করা ফাংশন হিসাবে পুনরায় সংজ্ঞায়িত করা হবে যা পাস করার পরে কিছুই করেনা -x
(যদিও এটি স্ক্রিপ্টটি ভেঙে ফেলবে (অথবা অন্য কোনও bash
স্ক্রিপ্ট এটি আহ্বান করে) set
অবস্থানগত পরামিতি সেট করতে ব্যবহৃত )।
ভালো লেগেছে:
set()
case $1 in
(-x) return 0;;
(-[!-]|"") builtin set "$@";;
(*) echo >&2 That was a bad idea, try something else; builtin set "$@";;
esac
export -f set
./script.bash
অন্য বিকল্পটি হ'ল একটি ডিবাগিজি ট্র্যাপ যুক্ত করা $BASH_ENV
উচিত যা set +x
প্রতিটি কমান্ডের আগে করে।
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
set -x
যদিও সাব-শেল-এ করা হয়ে গেলে এটি কাজ করবে না ।
@ ইল্ক্কাছু যেমন বলেছিলেন, আপনি যদি ফাইল সিস্টেমের কোনও ফোল্ডারে লেখার অনুমতি পেয়ে থাকেন তবে আপনার কমপক্ষে স্ক্রিপ্টের একটি অনুলিপি তৈরি করতে এবং এটি সম্পাদনা করতে সক্ষম হওয়া উচিত।
যদি কোথাও না থাকে আপনি স্ক্রিপ্টের একটি অনুলিপি লিখতে পারেন, বা প্রতিবার মূল স্ক্রিপ্টে আপডেট হওয়ার পরে কোনও নতুন অনুলিপি তৈরি করা এবং সম্পাদনা করা সুবিধাজনক না হলে আপনি এখনও করতে সক্ষম হবেন:
bash <(sed 's/set -x/set +x/g' ./script.bash)
এটি (এবং অনুলিপি পদ্ধতির) ঠিক মতো কাজ করতে পারে না যদি স্ক্রিপ্টটি অভিনব কিছু করে $0
বা বিশেষ ভেরিয়েবলের মতো করে $BASH_SOURCE
(যেমন স্ক্রিপ্টের অবস্থানের সাথে সম্পর্কিত ফাইলগুলি সন্ধান করা), সুতরাং আপনাকে আরও কিছু সম্পাদনা করার মতো হতে পারে $0
স্ক্রিপ্টের পথটি প্রতিস্থাপন করুন ...
./script 2>some_file