স্ট্যান্ডার্ড আউটপুট ইন্টারুপ্ট না করে লগফাইলে বাশ-এক্স আউটপুট প্রেরণ করুন


12

স্ক্রিপ্টটি চালাচ্ছেন কোনও ব্যবহারকারী দ্বারা দেখা স্ট্যান্ডার্ড আউটপুট পরিবর্তন না করে, কোনও ফাইল--x বিকল্পের সাহায্যে বাশ স্ক্রিপ্ট চালিয়ে প্রদর্শিত তথ্য প্রেরণের কোনও উপায় আছে কি?

এটি একটি ডিবাগিং বৈশিষ্ট্য যা আমি ব্যাশ স্ক্রিপ্টে প্রয়োগ করতে চাই যা আমরা প্রায়শই পরিবর্তন করি।

অনেক প্রশংসিত.

উত্তর:


21

-X থেকে আউটপুট স্টাড্রারে যায় না স্টাডআউট। তবে এটিও সমস্যা হতে পারে - প্রচুর স্ক্রিপ্টগুলির স্ট্যাডারের বিষয়বস্তুর উপর কার্যকরী নির্ভরতা থাকবে এবং কোনও কোনও ক্ষেত্রে ডিবাগ এবং স্ট্যাডার স্ট্রিমগুলি একসাথে মিশ্রিত করাতে তার ধরণের অগোছালোতা থাকবে।

বাশ সংস্করণ> 4.1 আলাদা সমাধান দেয়: BASH_XTRACEFD এনভায়রনমেন্ট ভেরিয়েবল আপনাকে একটি ফাইল বর্ণনাকারী নির্দিষ্ট করতে দেয় যা ডিবাগ স্ট্রিমটিতে প্রেরণে ব্যবহৃত হবে। এটি কোনও ফাইল বা পাইপ বা আপনার পছন্দ মতো অন্য কোনও ইউনিক্স-ওয়াই সদৃশ হতে পারে।

# Use FD 19 to capture the debug stream caused by "set -x":
exec 19>/tmp/my-script.log
# Tell bash about it  (there's nothing special about 19, its arbitrary)
export BASH_XTRACEFD=19

# turn on the debug stream:
set -x

# run some commands:
cd /etc
find 
echo "Well, that was fun."

# Close the output:
set +x
exec 19>&-

# See what we got:
cat /tmp/my-script.log

কিছুটা বেশি ঝাঁকুনির সাথে আপনি অন্যান্য জিনিসগুলিও করতে পারেন - যেমন স্টাডআউট এবং / বা স্টিডিন স্ট্রিমগুলিতে 'টি' করা এবং ডিবাগ আউটপুটযুক্ত ব্যক্তিদের মধ্যে অন্তর্ভুক্ত করা যাতে আপনার লগ আরও সম্পূর্ণ হয়। এ সম্পর্কিত আরও তথ্যের জন্য /programming/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself দেখুন

বিকল্পগুলির চেয়ে এই পদ্ধতির বড় সুবিধা হ'ল আপনি স্ট্রিডআউট বা স্ট্ডারগুলিতে ডিবাগ আউটপুট ইনজেকশন দিয়ে আপনার স্ক্রিপ্টের আচরণের পরিবর্তনের ঝুঁকি নিচ্ছেন না।


ফাইলটির জন্য অব্যক্ত ফাইল বিবরণী কীভাবে পাবেন তা এখানে দেখুন ।
জার্নো ২

ফাইল বিবরণকারী (যেমন লাইন exec 19>&-) বন্ধ করা কি প্রয়োজনীয় ? আমার অভিজ্ঞতায় এটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়, যখন স্ক্রিপ্ট শেষ হয়।
জার্নো

1
উপরের দেখানো কোডটি ধরে নেওয়া যাচ্ছে না যে আপনি স্ক্রিপ্টটি চালাচ্ছেন, বা স্ক্রিপ্টটি কতক্ষণ দীর্ঘ হতে পারে ইত্যাদি। সত্য যে আপনি যদি এই স্নিপেটটি যা করছেন কেবল তাই করেন এবং স্ক্রিপ্টে রাখলে ফাইল হ্যান্ডেলটি স্ক্রিপ্টের শেষে পুরো শেলটি চলে যাওয়ার কারণে বন্ধ হয়ে যাবে। সুতরাং যে ব্যবহারের ক্ষেত্রে, আপনার কঠোরভাবে হ্যান্ডেলটি বন্ধ করার দরকার নেই। তবে সাধারণভাবে কোনও সংস্থার বিরুদ্ধে কোডিং করার সময়, আপনি যা খুলেছেন তা বন্ধ করা ভাল অভ্যাস, কারণ তখন আপনার কোডটি বৃহত্তর প্রসঙ্গে ব্যবহার করা যেতে পারে যেখানে গৃহস্থালি রক্ষার বিষয়টি বেশি সম্ভাবনাযুক্ত।
স্টেলেডোগ

আপনি কেন BASH_XTRACEFD রফতানি করবেন? কেন এটির জন্য মূল্য নির্ধারণ করবেন না?
জার্নো

যাইহোক, ফাইল বর্ণনাকারী বন্ধ করার বিকল্প উপায় হ'ল BASH_XTRACEFD এর জন্য নতুন মান (যেমন নাল) সেট করা বা আনসেট না করা।
জার্নো

4

set -xস্ট্যান্ডার্ড আউটপুটে কিছু পাঠায় না, তাই কোনও সমস্যা নেই। এটি যা করে তা হ'ল স্ট্যান্ডার্ড ত্রুটিতে লিখুন যা ডিফল্টরূপে কনসোলে যায়।

আপনি যা করতে চান তা হ'ল স্টডআউটকে অন্য কোনও ফাইলে ডাইরেক্ট করা হবে:

/bin/sh -x /my/script/file 2>/my/log/file

1

দেখুন man tee

আপনি এটির মতো চালান tee commandname filenameএবং এটি এতে কমান্ড আউটপুট প্রদর্শিত হবে stdoutএবং এটিতেও লিখবে filename

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