দুটি পৃথক স্ট্রিমে stdout এবং stderr প্রদর্শন করুন


13

আমি দৃশ্যমানভাবে পৃথক স্টাডআউট এবং স্টডারার জন্য একটি উপায় খুঁজছি, যাতে তারা আন্তঃবিভক্ত না হয় এবং যাতে সহজেই তাদের চিহ্নিত করা যায়। আদর্শভাবে, stdout এবং stderr এর স্ক্রিনে পৃথক পৃথক অঞ্চল থাকতে পারে যেখানে তারা প্রদর্শিত হয়, যেমন বিভিন্ন কলামে। উদাহরণস্বরূপ, আউটপুট যা দেখতে এইরকম হত:

~$ some command
some useful output info
ERROR: an error
more output
ERROR: has occurred
another message
~$ 

পরিবর্তে এটি কিছু দেখতে হবে:

~$ some command          |
some useful output info  |
more output              |  ERROR: an error
another message          |  ERROR: has occurred
~$                       |


এই প্রশ্নটি একই জিনিস জিজ্ঞাসা করছে বলে মনে হয় না, এবং উত্তরগুলির কোনওটিই এখানে জিজ্ঞাসা করা হয়নি provide
মাইকেল হোমার

2
দুটি ভিন্ন লগ ফাইলগুলিতে স্ট্রিমগুলি পুনর্নির্দেশ করা এবং তারপরে মাল্টিটেলের মতো কিছু ব্যবহার করা কি কার্যকর হবে? vanheusden.com/multitail
কুসালানন্দ

এনেটেট-আউটপুট ইউটিলিটি কি দরকারী দেখাচ্ছে, বা আপনার কলামগুলিতে আউটপুট দরকার?
জেফ শ্যাচলার

উত্তর:


5

আপনি GNU screenএর উল্লম্ব বিভাজন বৈশিষ্ট্যটি ব্যবহার করতে পারেন :

#! /bin/bash -
tmpdir=$(mktemp -d) || exit
trap 'rm -rf "$tmpdir"' EXIT INT TERM HUP

FIFO=$tmpdir/FIFO
mkfifo "$FIFO" || exit

conf=$tmpdir/conf

cat > "$conf" << 'EOF' || exit
split -v
focus
screen -t stderr sh -c 'tty > "$FIFO"; read done < "$FIFO"'
focus
screen -t stdout sh -c 'read tty < "$FIFO"; eval "$CMD" 2> "$tty"; echo "[Command exited with status $?, press enter to exit]"; read prompt; echo done > "$FIFO"'
EOF

CMD="$*"
export FIFO CMD

screen -mc "$conf"

উদাহরণস্বরূপ ব্যবহার করতে:

that-script 'ls / /not-here'

ধারণাটি হ'ল এটি একটি অস্থায়ী কনফারেন্স ফাইলের সাথে পর্দা চালায় যা একটি উল্লম্ব বিভাজন বিন্যাসে দুটি স্ক্রিন উইন্ডো শুরু করে। প্রথমটিতে, আমরা স্ট্যান্ডার দ্বিতীয়টির সাথে সংযুক্ত হয়ে আপনার কমান্ডটি চালাচ্ছি।

আমরা দ্বিতীয় উইন্ডোটির টিটি ডিভাইসটি প্রথমটির সাথে যোগাযোগ করার জন্য একটি নামক পাইপ ব্যবহার করি এবং কমান্ডটি সম্পন্ন হওয়ার পরে প্রথমটির জন্য দ্বিতীয়টি জানাতে।

পাইপ-ভিত্তিক পদ্ধতির তুলনায় অন্য সুবিধাটি হ'ল কমান্ডের স্ট্ডআউট এবং স্ট্ডার এখনও টিটিআই ডিভাইসে সংযুক্ত রয়েছে, সুতরাং এটি বাফারিংকে প্রভাবিত করে না। উভয় প্যানগুলি স্বতন্ত্রভাবে এবং নীচে স্ক্রোল করা যায় ( screenএর অনুলিপি মোড ব্যবহার করে )।

আপনি যদি bashসেই স্ক্রিপ্টটির সাথে ইন্টারেক্টিভ মত শেল চালান , আপনি লক্ষ্য করবেন যে প্রম্পটটি দ্বিতীয় উইন্ডোতে প্রদর্শিত হবে, যখন শেলটি প্রথম উইন্ডোতে আপনি কী টাইপ করবেন সেগুলি পড়বে যখন সেই শেলগুলি স্ট্যাডারে তাদের প্রম্পট আউটপুট দেয়।

ক্ষেত্রে bash, প্রতিধ্বনি আপনি টাইপ কি যে যেমন দ্বিতীয় উইন্ডোতে প্রদর্শিত হবে প্রতিধ্বনি শেল (ক্ষেত্রে readline দ্বারা আউটপুট bashহিসাবে ভাল দ্বারা stderr তে) খুলুন। কিছু অন্যান্য শাঁস মতো ksh93, এটা প্রথম উইন্ডোতে (দেখাবে প্রতিধ্বনি , টার্মিনাল ডিভাইস ড্রাইভার দ্বারা আউটপুট, শেল নয়) যদি না আপনি শেল করা emacsবা viসঙ্গে মোড set -o emacsঅথবা set -o vi


1

এটি annotate-outputডেবিয়ান অ্যানোটেট-আউটপুট (1) এর স্ক্রিপ্টের ভিত্তিতে একটি কুৎসিত সমাধান । আপনি যা সন্ধান করছেন এটি এটি কিনা তা নিশ্চিত না তবে এর সাথে শুরু করার মতো কিছু হতে পারে:

#!/bin/bash 

readonly col=150 # column to start error output 

add_out ()
{
    while IFS= read -r line; do
        echo "$1: $line"
    done
    if [ ! -z "$line" ]; then
        echo -n "$1: $line"
    fi
}

add_err ()
{
    while IFS= read -r line; do
        printf "%*s  %s %s: %s\n" $col "|" "$1" "$line"
    done
    if [ ! -z "$line" ]; then
        printf "%*s %s: %s" $col "$1" "$line"
    fi
}

cleanup() { __st=$?; rm -rf "$tmp"; exit $__st; }
trap cleanup 0
trap 'exit $?' 1 2 13 15

tmp=$(mktemp -d --tmpdir annotate.XXXXXX) || exit 1
OUT=$tmp/out
ERR=$tmp/err

mkfifo $OUT $ERR || exit 1

add_out OUTPUT < $OUT &
add_err ERROR < $ERR &

echo "I: Started $@"
"$@" > $OUT 2> $ERR ; EXIT=$?
rm -f $OUT $ERR
wait

echo "I: Finished with exitcode $EXIT"

exit $EXIT

ব্যবহার করে আপনি এটি পরীক্ষা করতে ./this_script another_scriptবা command


1

আমি আপনার প্রশ্নের নিম্নলিখিত অংশটি বিশ্লেষণ করার চেষ্টা করব:

পরিবর্তে এটি কিছু দেখতে হবে:

 কিছু আদেশ
 কিছু দরকারী আউটপুট তথ্য |
 আরও আউটপুট | ত্রুটি: একটি ত্রুটি
 অন্য বার্তা | ত্রুটি: ঘটেছে
 ~ $ 

যদি আপনি যা চান সেটি ভেঙে ফেলতে চাইলে:

1) stdoutস্ট্রিমটি প্রতিটি লাইনটি একটি দিয়ে CR LFনয় তবে পরিবর্তে '|' দিয়ে শেষ করবে অক্ষর। এটি অবশ্যই দুটি ধারা একসাথে একত্রিত করবে না, এবং প্রান্তিককরণ প্রশ্নের বাইরে নয় কারণ এটিতে যুক্ত হওয়া ভবিষ্যতের লাইনের দৈর্ঘ্যের পূর্বাভাস দিতে হবে stdout, যা অবশ্যই অসম্ভব।

2) ধরে নেওয়া যায় আমরা প্রান্তিককরণের কথা ভুলে যাচ্ছি আমরা কেবল তখনই stderrপ্রতিটি লাইনের শুরুতে "ERROR:" যুক্ত একটি পাইপলাইন দ্বারা প্রক্রিয়াজাত হওয়ার পরে আউটপুট করব । আমি মনে করি একটি সাধারণ স্ক্রিপ্ট তৈরি করে এটি বেশ সহজ এবং নিশ্চিত হওয়া যায় stderrযে এই স্ক্রিপ্টটির মাধ্যমে সর্বদা বেরিয়ে আসে।

তবে এটি এর ফলে একটি আউটপুট তৈরি করবে:

কিছু আদেশ
 কিছু দরকারী আউটপুট তথ্য |
 আরও আউটপুট | ত্রুটি: একটি ত্রুটি
 অন্য বার্তা | ত্রুটি: ঘটেছে

যা সত্যই সহায়ক নয়, তাই না? এছাড়াও আমি বিশ্বাস করি না, এটি আপনার পরেও কি!

প্রাথমিক প্রশ্নটির সাথে আমার সমস্যাটি মনে হয় যে দুটি স্ট্রিমই অবিচ্ছিন্নভাবে লিখিত হতে পারে সে সম্পর্কে আপনি কোনও স্রোতে সংযুক্ত প্রতিটি লাইনের ক্রমিক প্রকৃতিটিকে বিবেচনা করবেন না।

আমি বিশ্বাস করি যে সবচেয়ে কাছের সম্ভাব্য সমাধানটি ব্যবহার করা হবে ncurses
দেখা.
[ http://www.tldp.org/HOWTO/html_single/NCURSES- প্রোগ্রামিং- হাওটো /]
[ http://invisible-island.net/ncurses/ncurses-intro.html#updating]

আপনার উভয় স্ট্রিম বাফার করার পরে আপনার যা করার তা করার জন্য এবং তাদের সাথে একত্রে তৃতীয় বাফার তৈরি করতে হবে যা উভয় বাফার থেকে উপাদান নেয়। তারপরে তৃতীয় বাফারটি টার্মিনাল স্ক্রিনে টার্মিনাল স্ক্রিনটি মুছে ফেলুন এবং তৃতীয় বাফার পরিবর্তন করে প্রতিবার এটি পুনরায় রঙ করুন। তবে এটি এইভাবে ncursesকাজ করে, তবে চাকাটি পুনরায় উদ্ভাবন করুন এবং সেখান থেকে এটি কেন নেওয়া হবে না?
যাই হোক না কেন, আপনাকে টার্মিনাল স্ক্রিনটি পুরোভাবে আঁকা যেভাবে নিতে হবে ! এবং আপনার পছন্দ মতো স্ক্রিনটির পুনরায় মুদ্রিত সংস্করণে পাঠ্যটি পুনরায় তৈরি করুন। টার্মিনাল অক্ষর সহ অনেকটা ভিডিও গেমের মতো।
আমি আশা করি আমার উত্তর আপনি যা পরে তার সীমাবদ্ধতাগুলি পরিষ্কার করতে সহায়ক হবে ...
আমাকে এটির পুনরাবৃত্তি করার জন্য ক্ষমা করবেন তবে আপনি যা দেখিয়েছেন তার সাথে সবচেয়ে বড় সমস্যা হ'ল এগুলি এবং সঠিকভাবে প্রান্তিককরণের জন্য প্রবাহ stdoutএবং stderrপ্রবাহগুলির "প্রসেসর" কীভাবে ভবিষ্যতে রেখার দৈর্ঘ্যকে আগে যুক্ত করতে পারে তা জানবে।

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