একবারে প্রচুর কমান্ড পুনঃনির্দেশ করার সমাধান হিসাবে:
#!/bin/bash
{
somecommand
somecommand2
somecommand3
} 2>&1 | tee -a $DEBUGLOG
আপনার আসল সমাধানটি কেন কাজ করে না: এক্সিকিউটিভ 2> & 1 স্ট্যান্ডার্ড ত্রুটি আউটপুটটিকে আপনার শেলের স্ট্যান্ডার্ড আউটপুটে পুনর্নির্দেশ করবে, যা আপনি যদি কনসোল থেকে আপনার স্ক্রিপ্টটি চালান, তবে এটি আপনার কনসোল হবে। কমান্ডগুলিতে পাইপ পুনর্নির্দেশ কেবল কমান্ডের স্ট্যান্ডার্ড আউটপুটটিকে পুনর্নির্দেশ করবে।
দৃষ্টিকোণে somecommand
, এর স্ট্যান্ডার্ড আউটপুটটি একটি পাইপের সাথে সংযুক্ত হয়ে tee
যায় এবং স্ট্যান্ডার্ড ত্রুটিটি শেলের স্ট্যান্ডার্ড ত্রুটির মতো একই ফাইল / সিউডোফিলিতে যায়, যা আপনি শেলের স্ট্যান্ডার্ড আউটপুটটিতে পুনর্নির্দেশ করেন যা হবে আপনি যদি কনসোল থেকে আপনার প্রোগ্রামটি চালনা করেন তবে কনসোল করুন।
এটি ব্যাখ্যা করার জন্য একটি আসল উপায় হ'ল সত্যটি কী ঘটে তা দেখা হচ্ছে:
আপনি যদি টার্মিনাল থেকে চালনা করেন তবে আপনার শেলের আসল পরিবেশটি দেখতে দেখতে এটি দেখতে পারা যায়:
stdin -> /dev/pts/42
stdout -> /dev/pts/42
stderr -> /dev/pts/42
আপনি স্ট্যান্ডার্ড ত্রুটিটিকে স্ট্যান্ডার্ড আউটপুট ( exec 2>&1
) এ রূপান্তরিত করার পরে , আপনি ... মূলত কিছুই পরিবর্তন করেন না। তবে আপনি যদি স্ক্রিপ্টের স্ট্যান্ডার্ড আউটপুট কোনও ফাইলে পুনর্নির্দেশ করেন তবে আপনি এমন পরিবেশের সাথে শেষ করবেন:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /dev/pts/42
তারপরে শেল স্ট্যান্ডার্ড ত্রুটিটিকে স্ট্যান্ডার্ড আউটপুটে পুনঃনির্দেশ করা শেষ হবে:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /your/file
একটি কমান্ড চালানো এই পরিবেশের উত্তরাধিকারী হবে। আপনি যদি কোনও কমান্ড চালনা করেন এবং এটি টিপতে পাইপ করেন তবে কমান্ডের পরিবেশটি হবে:
stdin -> /dev/pts/42
stdout -> pipe:[4242]
stderr -> /your/file
সুতরাং আপনার কমান্ডের স্ট্যান্ডার্ড ত্রুটিটি এখনও শেলটিকে তার স্ট্যান্ডার্ড ত্রুটি হিসাবে ব্যবহার করে into
আপনি আসলে একটি কমান্ডের পরিবেশ সন্ধান করে দেখতে পারেন /proc/[pid]/fd
: ls -l
প্রতীকী লিঙ্কের বিষয়বস্তু তালিকাভুক্ত করতেও ব্যবহার করুন। 0
ফাইল এখানে স্ট্যান্ডার্ড ইনপুট হয়, 1
মান আউটপুট এবং 2
মান ত্রুটি। যদি কমান্ডটি আরও ফাইল খুলবে (এবং বেশিরভাগ প্রোগ্রামগুলি করে), আপনি সেগুলিও দেখতে পাবেন। একটি প্রোগ্রাম এছাড়াও পুনর্নির্দেশ বা তার মান ইনপুট / আউটপুট এবং পুনরায় ব্যবহার বন্ধ করা চয়ন করতে পারেন 0
, 1
এবং 2
।
|&
শর্টকাট হিসাবে কাজ করে2>&1 |
এটি কমপক্ষে কিছুটা সুবিধাজনক।