লিনাক্স কম আচরণ এবং stderr


11

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

আমি বুঝতে পারছি এটার কোন সমাধান হতে পারে, আমি সম্পর্কে পড়তে teeএবং multiteeকিন্তু কোন ভাগ্য এতদূর।


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

যদি এতে stderrপুনঃনির্দেশিত হয় তবে stdoutসমস্ত আউটপুট স্বাভাবিক আউটপুটটির সাথে মিশ্রিত stderr হবেstdout । এই আউটপুটটি পাইপ করা lessউভয়ই দেখায়।
কিছু প্রোগ্রামার

আমি যদি "কম প্রস্থান করার সময় টার্মিনালে থাকতে স্টেডারকে উপেক্ষা করি", আমি lessস্ক্রিনটি পুনরায় রঙ করতে Ctrl-L টিপতে পরামর্শ দিই ।
কামে

উত্তর:


10

হতে পারে

command 2> command.err | less; cat command.err; rm command.err

অভিযোজ্য বস্তু

এখানে লোক যারা অবহেলা জন্য একটি শোধন অনুসরণ সাবধানে প্রশ্ন পড়া এবং যারা উপরে ওপি এর বিষয়ে পরিষ্কারভাবে বর্ণনা করা মন্তব্য পড়তে হয়নি।

হেলিক্স নির্দেশিত:

স্ট্যাডার লাইনগুলি সাধারণত কম ভিতরে স্টডআউট লাইনের অভ্যন্তরে তালিকাভুক্ত হয়

এবং, প্রাথমিক উত্তরদাতাদের জন্য একটি মন্তব্যে লিখেছেন:

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

সমস্যা সম্ভবত প্ল্যাটফর্ম নির্দিষ্ট, এটি অবশ্যই আমি পুরানো ইউনিক্স এসভিআর 4 প্ল্যাটফর্মগুলিতে অভিজ্ঞতা পেয়েছি।

যদি, এই জাতীয় প্ল্যাটফর্মে, আপনি যেমন কিছু করেন

 find / ... | less

কোনও ত্রুটি বার্তা (উদাহরণস্বরূপ ডিরেক্টরি অনুমতি) এর চেয়ে কম উপস্থিত হয়

 stdout line 1
 stdout line 2
 error message text
 stdout line 4

যাতে আউটপুট লাইনগুলি ত্রুটি বার্তাগুলি দ্বারা অস্পষ্ট হয়।

আপনি পৃষ্ঠাটি রিফ্রেশ করলে আউটপুট লাইনগুলি সঠিকভাবে প্রদর্শিত হয় তবে আপনি ত্রুটি বার্তাগুলি হারাবেন। আপনি কম প্রস্থান করলে কমান্ড প্রম্পট ব্যতীত স্ক্রিন সাফ হয়ে যায়।

এমন কিছু করলে

  find / ... 2>&1 | less

ত্রুটি বার্তাগুলি স্ট্যান্ডার্ড আউটপুটটির সাথে মিলিত হয়। আবার যখন আপনি কম প্রস্থান করবেন তখন স্ক্রিনটি খালি।

আপনি যদি প্রথমে কম মাত্র স্ট্যান্ডার্ড আউটপুট অনুধাবন করতে চান তবে কম প্রস্থান করার পরে ত্রুটি বার্তাগুলি দেখুন, আপনার আলাদা সমাধান দরকার need

এটিই আমি আমার মূল, দুই-লাইনের উত্তরে সাময়িকভাবে পরামর্শ দিচ্ছিলাম।


এটি আবর্জনা। জোয়াকিমের উত্তর অবশ্যই গ্রহণযোগ্য হওয়া উচিত।
ভ্যানিলা ফেস

2
@ ভ্যানিলাফ্রেস: আমি আমার উত্তরে কিছু স্পষ্টকারী উপাদান যুক্ত করেছি।
রেডগ্রিটিব্রিক

16

আপনাকে এখানে পুনঃনির্দেশ stderrকরতে হবে stdout:

$ ./somecommad 2>&1 | less

আপনার শেলটির জন্য ম্যানুয়ালটি পরীক্ষা করুন (উদাঃ man bash)


1
এই পুরানো প্রশ্নের নতুন পাঠকদের জন্য মন্তব্য (বিশেষত জোয়াকিমের জন্য নয়) এই প্রশ্নের প্রথম স্ক্যান করার সময় সকলেই এটি মনে করেন। তবে সমস্যাটি আরও সূক্ষ্ম - ডেমকির উত্তরের
রেডগ্রিটিব্রিক

জন্য সাধারণভাবে সংক্ষেপে 2> & 1 হয় & | । সুতরাং, এটি সরল করা যেতে পারে$ ./somecommad |& less
মেলভিন আব্রাহাম

1

শেলটি কেবল fd 2 থেকে এফডি 1 তে পুনঃনির্দেশ করতে বলুন (স্ট্ডার থেকে স্টডআউট)

 make 2>&1 | less

1

এতক্ষণে সমস্ত উত্তর থেকে যে জিনিসটির অভাব ছিল তার কারণ হ'ল কেন এটি হচ্ছে। এখানে সমস্যা প্রক্রিয়া আউটপুট কাপড় মধ্যে জাতি অবস্থার কিছু ধরনের stderrএবং lessথেকে আউটপুট প্রদর্শন করার stdoutটার্মিন্যালে। যদি সমস্ত আউটপুট টার্মিনালে মুদ্রিত হওয়ার পরেless প্রদর্শিত শুরু হয় , তবে এটি সংরক্ষণ করা হবে এবং আপনি প্রস্থান করার পরে বার্তাগুলি দেখতে পাবেন । OTOH যদি ইতিমধ্যে স্টাফ প্রদর্শন করা শুরু করে থাকে, তবে ত্রুটি বার্তাগুলি এর আউটপুটটির সাথে মিলিত হয় এবং প্রস্থান করার পরে কিছুই সংরক্ষণ করা হয় না (কারণ এটি টার্মিনালটি সংরক্ষণের আগে যেমন ছিল তেমন সংরক্ষণ করে এবং এর মধ্যে উপস্থিত ত্রুটি বার্তাগুলি সম্পর্কে কিছুই জানে না)।stderrlesslesslesslesslessless

আপনি উদাহরণস্বরূপ যদি এটি সহজেই দেখতে পারেন

grep foo -r /etc | less

সমস্ত "অনুমতি অস্বীকৃত" ত্রুটি বার্তাগুলি lessআউটপুট সাথে মিশ্রিত হয় এবং আপনি প্রস্থান করার পরে কিছুই থাকবে না। যদি তুমি করো

grep foo -r /etc | (sleep 10; less)

lessআউটপুট প্রদর্শন করার সুযোগ পাওয়ার আগে সমস্ত (বা কমপক্ষে) ত্রুটি বার্তাগুলি টার্মিনালে মুদ্রিত হয়ে গেছে এবং এরপরে আপনি ত্রুটি বার্তাগুলি দেখতে পাবেন।

অবশ্যই, আপনি সাধারণত শুরু করার আগে 10 সেকেন্ড অপেক্ষা করতে চান না less, তবে লিনাক্সের সাহায্যে আপনি অপেক্ষার সময়ের জন্য ভগ্নাংশের মানও সরবরাহ করতে পারেন এবং দ্রুত চলমান প্রক্রিয়াগুলি প্রায়শই sleep 0.1দৌড়ের পরিস্থিতি এড়াতে যথেষ্ট কম । (তবে, অবশ্যই, যদি আপনি চান বা সত্যিই নিরাপদ দিকে থাকতে চান তবে রেডগ্রিটিব্রিকের সমাধানটি ব্যবহার করুন)।


0

আপনার "ফাইল বর্ণনাকারী" ধারণাটি বুঝতে হবে। সাধারণত, একটি ইউনিক্স অ্যাপ্লিকেশন তিনটি বিশেষ ফাইল বর্ণনাকারী দিয়ে শুরু হবে:

  • স্ট্যান্ডার্ড ইনপুট
  • স্ট্যান্ডার্ড আউটপুট
  • মান ত্রুটি

|শেলের "পাইপ" পরেরটির সাথে stdoutএকটি প্রক্রিয়া থেকে সংযুক্ত হয় stdin

ত্রুটিগুলি হ'ল - নকশা অনুসারে - stdinপরবর্তী প্রক্রিয়াটি খাওয়ানো হয় না । তারা প্রায়শই পরবর্তী অ্যাপ্লিকেশনটি বোঝায় না এবং ব্যবহারকারীর কাছ থেকে লুকানো উচিত নয়।

আপনি যদি স্টডআউটে ত্রুটিগুলি মিশ্রিত করতে চান তবে আপনি উদাহরণস্বরূপ ব্যবহার করতে পারেন 2>&1, যা মূলত "স্টাডআউট টু স্টাডআউট" বলে। উদাহরণ স্বরূপ

find /etc 2>&1 | less

অ্যাক্সেসযোগ্য ফাইল থেকে ত্রুটি আউটপুটও অন্তর্ভুক্ত করা উচিত।

find /etc 2>&1 >/dev/null | less

শুধুমাত্র ত্রুটি আপনাকে দিতে হবে।


0

আমি আপনার প্রশ্ন সম্পর্কে বিভ্রান্ত, আমি যতদূর বলতে পারি আপনার পছন্দসই আচরণটি ডিফল্ট।

আমি যখন ব্যবহার করি

#include <stdio.h>

int main(int argc, char**argv){
  for (int j=0; j<10; ++j){
    fprintf( (j%2 ? stdout : stderr) , "%d\n" , j);
  }
  return 0;
}

একটি সহজ পরীক্ষা পেতে,

$ ./testredirection | less

আপনি যা চান ঠিক তাই করে তাও আমি দেখছি

1
3
5
7
9
(END) 

ইন lessএবং

$ ./testredirection | less
0
2
4
6
8
$ 

যখন আমি ছাড়ি less


এটি অদ্ভুত তবে বিষয়গুলি সর্বদা এটির মতো হয় না। একটি স্ক্রিপ্ট ( echo info ; echo error 1>&2) দিয়ে চেষ্টা করুন এবং পরীক্ষার পুনরাবৃত্তি করুন: উভয় লাইন কম পাইপ করা হয়েছে।
সিউরাস

@ ক্রিস: এটি আমার পক্ষেও প্রত্যাশার মতো কাজ করে। 'আমি একটি ম্যাক ওএস বাক্সে চেষ্টা করেছি। 3.2.17 কম, 394 কম Maybe সম্ভবত কিছু লিনাক্স নির্দিষ্ট। যে কোনও ক্ষেত্রেই রেডগ্রিটিব্রিকের দৃষ্টিভঙ্গি ঠিকভাবে কাজ করা উচিত।
dmckee --- প্রাক্তন-মডারেটর বিড়ালছানা

অদ্ভুত! ডেবিয়ান
স্কিজে

হ্যাঁ, আমি কর্মক্ষেত্রে বৈজ্ঞানিক লিনাক্স 5.3 বাক্সের একটি শেল খুলেছি এবং 3.0.০.১৫ বা তার চেয়ে কম 382 বাশের সাথে প্রত্যাশিত আচরণ পেয়েছি there
dmckee --- প্রাক্তন মডারেটর বিড়ালছানা

আমি জানি না, আমি মনে করি এটি কেবল বাফারিংয়ের বিষয়।
cirus

0

আমি সম্প্রতি আমার ডেবিয়ান 5.0 এর একটিতে এই সমস্যার মুখোমুখি হতে পারি। উদাহরণস্বরূপ, ls abc | কম আমি দেখতে পেয়েছি যে ত্রুটি বার্তাটি কম যায় যা আমার জ্ঞানের বিপরীতে।

কিছু চেষ্টার পরে, আমি আবিষ্কার করেছি যে এটি কেবল স্ক্রিন বাফার সম্পর্কিত কিছু related stderr আসলে কম যায় না। আপনি উপরে বা ডাউন তীর কী (বা জে / কে) প্রদর্শন করতে পারেন।

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