পাইপিং STDERR বনাম STDOUT


24

" লিনাক্স: সম্পূর্ণ রেফারেন্স 6th ষ্ঠ সংস্করণ " (পৃষ্ঠা 44) অনুসারে, পুনঃনির্দেশ চিহ্নগুলি ব্যবহার করে আপনি কেবল এসটিডিআরআর পাইপ করতে পারেন |&

এটি পরীক্ষা করার জন্য আমি একটি খুব সহজ স্ক্রিপ্ট লিখেছি:

#!/bin/bash
echo "Normal Text."
echo "Error Text." >&2

আমি এই স্ক্রিপ্টটি এভাবে চালিত করি:

./script.sh |& sed 's:^:\t:'

সম্ভবত, কেবল এসটিডিআরআরে মুদ্রিত লাইনগুলি ইন্টেন্ট করা হবে। তবে, এটি আসলে এর মতো কাজ করে না, যেমনটি আমি দেখছি:

    Normal Text.
    Error Text. 

আমি এখানে কি ভুল করছি?

উত্তর:


26

আপনার বইটি কোন পাঠ্য ব্যবহার করে তা আমি জানি না, তবে ব্যাশ ম্যানুয়ালটি স্পষ্ট (যদি আপনি ইতিমধ্যে পুনঃনির্দেশগুলির সাথে কিছুটা পরিচিত হন):

যদি |&এটি ব্যবহার করা হয়, কমান্ড 1 এর স্ট্যান্ডার্ড ত্রুটি, এর স্ট্যান্ডার্ড আউটপুট ছাড়াও, পাইপটির মাধ্যমে কমান্ড 2 এর স্ট্যান্ডার্ড ইনপুটটির সাথে সংযুক্ত থাকে; এটা সংক্ষিপ্ত 2>&1 |। স্ট্যান্ডার্ড আউটপুটে স্ট্যান্ডার্ড ত্রুটির এই অন্তর্নিহিত পুনঃনির্দেশ কমান্ড দ্বারা নির্দিষ্ট কোনও পুনর্নির্দেশের পরে সঞ্চালিত হয়।

সুতরাং আপনি যদি স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটি মিশ্রণ করতে না চান, আপনাকে অন্য কোথাও স্ট্যান্ডার্ড আউটপুট পুনর্নির্দেশ করতে হবে। স্ট্যান্ডার্ড ত্রুটি স্ট্রিম (স্টডার) গ্রেপ করবেন কীভাবে দেখুন ?

{ ./script.sh 2>&1 >&3 | sed 's:^:\t:'; } 3>&1

উভয় 1 এবং 3 FD script.shএবং sedঅবশ্য মূল stdout- এ গন্তব্য নির্দেশ করবে। আপনি যদি একজন ভাল নাগরিক হতে চান তবে আপনি এইচডি 3 বন্ধ করতে পারেন যা এই আদেশগুলির প্রয়োজন নেই:

{ ./script.sh 2>&1 >&3 3>&- | sed 's:^:\t:' 3>&-; } 3>&1

bashএবং ksh93ঘনীভূত করতে >&3 3>&-করতে >&3-(FD পদক্ষেপ)।


ব্যাশ ম্যানুয়ালটি আমার কাছে সম্পূর্ণ পরিষ্কার নয়। আমি বেশ বুঝতে পারছি কেন প্রস্তুত হত্তয়া পছন্দ করেন ./script.sh > /tmp/stdout_goes_here |& grep 'grepping_script_stderr'কাজ না করে, অর্থাত অভিপ্রেত হিসাবে: পুনর্নির্দেশ script.shএর stdout(যা, ম্যানুয়াল স্নিপেট প্রথম ঘটা উচিত অনুযায়ী), তারপর অনুমতি দেয় grepস্ক্রিপ্টের প্রক্রিয়া stderr। পরিবর্তে, stderrএবং tdout` উভয়ই শেষstdout_goes_here
এসএক্সসি 1১১

1
@ sxc731 এর |&জন্য শর্টহার্ড 2>&1 |। সুতরাং >/tmp/stdout_goes_here |&stdout এ পুনঃনির্দেশ করে /tmp/stdout_goes_here, তারপরে 2>&1stdrr যেখানে যেখানে চলেছে সেখানে যা পুনর্নির্দেশ করে যা /tmp/stdout_goes_hereশেষ পর্যন্ত |কোন ইনপুট গ্রহণ করে না কারণ কমান্ডের আউটপুট পুনঃনির্দেশিত হয়েছে। মনে রাখবেন যে ফাইল ডেস্ক্রিপ্টর 1 বর্তমানে চলছে যেখানেই>&1 ডাইরেক্টর্ট করে, যেখানে ফাইল ডেস্ক্রিপ্টর 1 শেষ হবে সেখানে নয় । স্ট্যাডারকে কেবল পাইপ করতে এবং স্টডআউটকে কোনও ফাইলে পুনঃনির্দেশ করতে, একটি উপায় 2>&1 >/tmp/stdout_goes_here |
23-29

6

|&পাইপ স্ট্যাডার থেকে স্টিডিনের মতো 2>&1 |, সুতরাং পরবর্তী প্রোগ্রাম স্ট্যান্ডে উভয়ই পাবে।

$cat test.sh
#!/bin/bash
echo "Normal Text."
echo "Error Text." >&2
$./test.sh | sed 's:^:\t:'
Error Text.
        Normal Text.
$ ./test.sh |& sed 's:^:\t:'
        Normal Text.
        Error Text.

ওহ, সুতরাং এটি মূলত দীর্ঘ প্রকাশের সমতুল্য runcommand 2>&1 | tee? অর্থাৎ runcommand |& tee?
নাফটুলি কে

হ্যাঁ, তারা একই রকম
কেভিন

1

|&ব্যাশ-এ কেবল একটি (ভয়াবহ পোর্টেবল নয়) শর্টকাট 2>&1 |, সুতরাং আপনার প্রতিটি লাইন ইন্ডেন্টড হওয়া উচিত।

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