সঙ্গে bash4.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