কোনও কমান্ড বা শেল স্ক্রিপ্টের আউটপুট যদি স্টাডআউট বা স্টডার হয় তা কীভাবে বলা যায়


32

আসুন আমি বলি যে আমি একটি কমান্ড বা শেল স্ক্রিপ্ট রান করি এবং এটি আমাকে আউটপুট দেয়। এই কমান্ড বা শেল স্ক্রিপ্ট অভ্যন্তরীণ বুদ্ধিমান ছাড়া, এক কিভাবে নির্ধারণ করে যদি আউটপুট থেকে ছিল stderrবা stdout?

যেমন,

$ ls -ld /
drwxrwxr-t  35 root  admin  1258 Dec 11 19:16 /

বনাম

ls -ld /test
ls: /test: No such file or directory

প্রথম কমান্ডটি মুদ্রিত হয়েছিল stdoutএবং দ্বিতীয়টি stderr(এটি করেছিল?) কীভাবে আমি তা সনাক্ত করব ?


1
আপনি এখানে কোন সমস্যার সমাধান করার চেষ্টা করছেন?
কেন্সটার

3
ভয় ছিল যে কেউ এটি জিজ্ঞাসা করবে; কিছুই সত্যই নয়, বেশিরভাগই কৌতূহলী এবং পুনঃনির্দেশ সম্পর্কে আমার বোঝার উন্নতি করার আশা করে।
কেএম

7
আপনি stderredনিজের শেল পরিবেশটি LD_PRELOADপেতে stdoutএবং stderrবিভিন্ন রঙে রাখতে পারেন। এখানে শিরা সম্পর্কিত একটি সম্পর্কিত প্রশ্ন।
আনকো

উত্তর:


18

আউটপুটটি ইতিমধ্যে মুদ্রিত হয়ে যাওয়ার পরে বলার উপায় নেই। এই ক্ষেত্রে, উভয়ই stdoutএবং stderrটার্মিনালের সাথে সংযুক্ত, সুতরাং কোন স্ট্রিমটিতে রচনা লেখা হয়েছিল সে সম্পর্কে আপনার টার্মিনালে পাঠ্যটি প্রকাশের সময় ইতিমধ্যে হারিয়ে গিয়েছিল; প্রোগ্রামটি এটি টার্মিনালে তৈরি করার আগে তাদের দ্বারা একত্রিত হয়েছিল।

আপনি কি করতে পারেন কি, উপরোক্ত মত একটি ক্ষেত্রে, সঙ্গে নিম্নলিখিত কমান্ডটি প্রয়োগ করতে হবে stdoutএবং stderrবিভিন্ন স্থানে থেকে আপনাকে পুনঃনির্দেশিত এবং দেখুন সেখানে কি ঘটছে। অথবা এটা দুইবার চালানোর সঙ্গে একবার stdoutপুনঃনির্দেশিত করা /dev/nullএবং একবার stderrথেকে আপনাকে পুনঃনির্দেশিত /dev/nullএবং পাঠ্য যাদের ক্ষেত্রে ফলাফল যা দেখানো দেখুন।

আপনি পুনর্নির্দেশ করতে পারেন stdoutকরতে /dev/nulltacking দ্বারা >/dev/nullকমান্ড লাইনের প্রান্তে, এবং আপনি পুনর্নির্দেশ করতে পারেন stderrথেকে /dev/nullযোগ করে 2>/dev/null


9

আপনি stdout ব্যবহার করে পুনর্নির্দেশ করতে পারেন > file, এবং stderr ব্যবহার করে পুনঃনির্দেশ 2> file। অনেকগুলি আধুনিক শেল কমান্ডগুলিতে পুনঃনির্দেশকে সমর্থন করে, তাই আপনি sedকোন স্ট্রিম থেকে কোন আউটপুট আসে তা হাইলাইট করতে আপনি ব্যবহার করতে পারেন :

$ ls 2> >(sed 's/^/2: /') > >(sed 's/^/1: /')
1: unity_support_test.0
1: vmwareDnD

$ ls foo 2> >(sed 's/^/2: /') > >(sed 's/^/1: /')
2: ls: cannot access foo: No such file or directory

খুব সুন্দর! যদি কেউ উপসর্গের পরিবর্তে রঙগুলিতে লাইনগুলি হাইলাইট করতে পারে তবে দুর্দান্ত হবে।
dotancohen

3
@ ডোটানকোহেন: একজন পারবেন! যেমন,(echo "this is stdout"; echo "this is stderr" >&2) > >(sed 's/.*/\x1b[32m&\x1b[0m/') 2> >(sed 's/.*/\x1b[31m&\x1b[0m/')
দুপুর ২ টা

মনে রাখবেন যে স্টাডাউট এবং স্টডার থেকে যদি মিশ্র আউটপুট থাকে তবে প্রথমে স্টাডআউট মুদ্রিত হবে, তারপরে স্ট্ডার হবে।
nyuszika7h

5

annotate-outputডেবিয়ান এর থেকে স্ক্রিপ্ট devscriptsআপনি এই বেছে বেছে করতে দেয়:

$ annotate-output ls -ld /test
14:54:22 -: Started ls -ld /test
14:54:22 E: ls: cannot access /test: No such file or directory
14:54:22 -: Finished with exitcode 2

দ্বিতীয় কলামে stdout- এ সঙ্গে দ্বারা stderr ইঙ্গিত Oএবং Eযথাক্রমে।

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

এই পদ্ধতিটি ফিফো ব্যবহার করে, একটি ফিফটোকে লেখার ক্ষেত্রে কোনও টিটিটির কাছে লেখার চেয়ে আলাদা আচরণ করতে পারে এবং দু'জন পৃথক ফিফোতে লেখা অবশ্যই আলাদা (সম্ভাব্য সময় / আন্তঃস্রাবের বিষয়) is এছাড়াও, এটি ইন্টারেক্টিভ ব্যবহারের জন্য উপযুক্ত নয়, যেমন annotate-output bashকোনও দুর্দান্ত পরিকল্পনা নয়, তবে এটি অন্যান্য অনেক উদ্দেশ্যে কার্যকর। স্ট্যান্ডিন / স্ট্ডআউট / স্টার্ডার রঙিন সংক্রান্ত সম্পর্কিত প্রশ্নের উত্তরে স্ক্রিপ্টস এবং শেল ফাংশনগুলির অনেকগুলি উদাহরণ রয়েছে, সর্বাধিক মজবুত স্টার্ডার্ড যা স্টার্ডারের লিখিত ডেটা পরিবর্তন করার জন্য (সর্বাধিক) প্রোগ্রামগুলির রানটাইম পরিবর্তন ব্যবহার করে।

এই প্রশ্নটির সাথে অ্যাঙ্কো লিঙ্ক করেছে যে সম্পর্কিত থিমটিতে ভাল উত্তর রয়েছে: স্ট্ডআউট / স্টডার আউটপুট রঙিন: আমি কী আমার শেলটি বিভিন্ন রঙে এসটিডিআরআর এবং স্টাডিআউট প্রিন্ট করতে কনফিগার করতে পারি?


1
নোট করুন যে এটি bashস্ক্রিপ্টটি while readলুপগুলি ব্যবহার করে এবং dateস্টাডাউট বা স্টডারারের প্রতিটি লাইনের জন্য একটি কমান্ড চালায় , সুতরাং এটি cmd > >(ts '%T O:') 2> >(ts '%T E:')সমমানের তুলনায় অনেক কম দক্ষ হতে চলেছে ।
স্টাফেন চেজেলাস

1

অন্যান্য উত্তরগুলি বাদ দিয়ে, এটি ইন্টেরেসেন্টিভ /proc/$PID/fd(যদিও এটি প্রশ্নের উত্তর দেয় না):

$ cat > /dev/null 2> /tmp/blablah &
[1] 3073

[1]+  Stopped                 cat > /dev/null 2> /tmp/blablah
$ ls -l /proc/3073/fd
total 0
lrwx------ 1 kampde kampde 64 Feb 24 11:43 0 -> /dev/pts/33
l-wx------ 1 kampde kampde 64 Feb 24 11:43 1 -> /dev/null
l-wx------ 1 kampde kampde 64 Feb 24 11:43 2 -> /tmp/blablah

আপনি দেখতে পাচ্ছেন, এখানে আপনি কোনও প্রক্রিয়াটির জন্য ফাইল বিবরণকারী খোলা দেখতে পাচ্ছেন। 0হয় STDIN, 1হয় STDOUTএবং 2হয় STDERR। আপনার যদি STDOUT বা STDERR পুনর্নির্দেশ না করা থাকে তবে আপনি দেখতে পাবেন /dev/pts/33(অন্তত এই উদাহরণে) কারণ তারা টার্মিনালটিতে নির্দেশ করবে।

দ্রষ্টব্য : /proc/$PIDকেবল চলমান প্রক্রিয়াগুলির জন্য বিদ্যমান। এই ক্ষেত্রে আমি catতর্ক ছাড়াই ব্যবহার করেছি তাই এটি বন্ধ না হওয়া পর্যন্ত শেষ হয় না STDIN। আমি এটি ব্যাকগ্রাউন্ডেও কার্যকর করেছি তাই এই উদাহরণটির জন্য আমি তত্ক্ষণাত পিআইডি রাখি।


0

আপনি কী জিজ্ঞাসা করছেন এটি পুরোপুরি পরিষ্কার নয় তবে এটি সাহায্য করতে পারে

ls -ld /
echo $?    # Exit status 0 returned because command executed successfully.

ls -ld /test
echo $?    # Non-zero exit status returned -- command failed to execute

সূত্র

যদি প্রস্থান কোড 0 হয় তবে এর সহজ অর্থ হ'ল কমান্ডটি সঠিকভাবে কার্যকর করা হবে (stdout), এখানে আপনি প্রস্থান কোড 0 (স্টডার) এর চেয়ে আলাদা হলে এখানে অর্থ খুঁজে পেতে পারেন


অনেক আগ্রহব্যাঞ্জক! আমি কখনও পুনর্নির্দেশের সাথে প্রস্থান স্থিতিগুলিকে সংযুক্ত করতাম না। শূন্যটি কি বোঝায় stdoutএবং শূন্য নয় stderr?
কেএম

7
@ কেএম।, না আমি বলি এটি দৃ strongly়ভাবে সম্পর্কিত, তবে এমন কোনও কিছুই নেই যা কোনও প্রোগ্রামকে stderrকোনও ভাল ত্রুটি কোড লেখা stdoutএবং ফিরিয়ে দেওয়া বা খারাপ ত্রুটি কোডটিতে লিখন এবং ফিরিয়ে দেওয়া থেকে বিরত থাকে । আসলে, চেষ্টা করে দেখুন find /root- আপনি রুট হিসাবে চলছেন না, আপনার 2 লাইন মুদ্রিত হওয়া উচিত - "/ রুট" এ মুদ্রিত হয়ে যায় stdoutএবং "সন্ধান করুন / রুট: অনুমতি প্রত্যাখ্যান করা হয়েছে" এতে মুদ্রিত হয়ে যায় stderr। এবং রিটার্নগুলির একটি খারাপ রিটার্ন কোড পান।
গডলিজিক

অপের সমস্যাটি স্পষ্ট যে স্টাডাউট বা স্টার্ডার কীভাবে তা জানাতে হবে।
it_is_a_literature

0

সাধারণত এসটিডিআরআর একটি কোলনের সাথে মেসেজটিতে প্রোগ্রামের নামটি চাপিয়ে দেয়।

উদাহরণ:

rpm -zq some_utils 
rpm: -zq: unknown option

বনাম

rpm -ql some_utils 
package some_utils is not installed

-1

ত্রুটি আউটপুট জন্য ক্যাপচার এবং পরীক্ষা করতে:

ls -l test 2>errors
if [ -s errors ]; then echo "There were errors:" && cat errors; fi
rm errors
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.