কোনও প্রোগ্রাম কীভাবে সিদ্ধান্ত নিতে পারে রঙিন আউটপুট থাকবে কি না?


17

আমি যখন টার্মিনাল থেকে একটি কমান্ড কার্যকর করি যা রঙিন আউটপুট (যেমন lsবা gcc) প্রিন্ট করে, রঙিন আউটপুট মুদ্রিত হয়। আমার উপলব্ধি থেকে, প্রক্রিয়াটি আসলে এএনএসআই এস্কেপ কোডগুলি আউটপুট দেয় এবং টার্মিনালটি রঙ ফর্ম্যাট করে।

তবে, যদি আমি একই কমান্ডটি অন্য কোনও প্রক্রিয়া দ্বারা চালিত করি (একটি কাস্টম সি অ্যাপ্লিকেশন বলুন) এবং আউটপুটটিকে অ্যাপ্লিকেশনটির নিজস্ব আউটপুটে পুনর্নির্দেশ করি, তবে এই রঙগুলি স্থির থাকে না।

কোনও প্রোগ্রাম কীভাবে সিদ্ধান্ত নিতে পারে যে রঙ বিন্যাস সহ পাঠ্য আউটপুট দেওয়া হবে না? কিছু পরিবেশ পরিবর্তনশীল আছে?

উত্তর:


25

এই জাতীয় বেশিরভাগ প্রোগ্রাম কেবলমাত্র একটি টার্মিনালে রঙিন কোডকে ডিফল্টরূপে আউটপুট দেয়; তারা ব্যবহার করে তাদের আউটপুট টিটিওয়াই কিনা তা পরীক্ষা করে দেখুন isatty(3)। এই আচরণকে ওভাররাইড করার জন্য সাধারণত বিকল্প রয়েছে: সমস্ত ক্ষেত্রে রঙ অক্ষম করুন বা সমস্ত ক্ষেত্রে রঙ সক্ষম করুন। জিএনইউর grepউদাহরণস্বরূপ, --color=neverরঙগুলি অক্ষম করে এবং --color=alwaysতাদের সক্ষম করে।

শেলের মধ্যে আপনি -t testঅপারেটরটি ব্যবহার করে একই পরীক্ষা করতে পারেন : [ -t 1 ]স্ট্যান্ডার্ড আউটপুটটি টার্মিনাল হলেই সফল হবে।


প্রক্রিয়াটি tty যে চালু অ্যাপ্লিকেশনটি চালিত করার কিছু উপায় আছে?
ক্রিস স্মিথ

4
জিজ্ঞাসা এবং এ উত্তরে unix.stackexchange.com/questions/249723 ইতিমধ্যে chris13523। মন্তব্যগুলি সত্যই ফলো-অন প্রশ্নগুলির স্থান নয় way
জেডিবিপি

1
@ chris13524 JdeBP এর লিঙ্কটি দেখুন; আপনি প্রোগ্রামগুলিকে অনেক ক্ষেত্রে রঙ কোড আউটপুট করতে বাধ্য করতে পারেন (আমার আপডেট হওয়া উত্তর দেখুন)।
স্টিফেন কিট

13

কিছু পরিবেশ পরিবর্তনশীল আছে?

হ্যাঁ. এটি TERMপরিবেশে পরিবর্তনশীল। এটি কারণ যে প্রক্রিয়াটির অংশ হিসাবে বেশ কয়েকটি জিনিস ব্যবহৃত হয়।

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

  • দ্বারা নির্ধারিত হিসাবে স্ট্যান্ডার্ড আউটপুট অবশ্যই টার্মিনাল ডিভাইস হতে হবে isatty()
  • প্রোগ্রামটি অবশ্যই টার্মক্যাপ / টার্মিনো ডাটাবেসে টার্মিনাল ধরণের রেকর্ড সন্ধান করতে সক্ষম হবে।
  • সুতরাং সুতরাং সেখানে উচিত হবে সন্ধান করার একটি টার্মিনাল প্রকার। TERMএনভায়রনমেন্ট ভেরিয়েবল থাকা আবশ্যক এবং তার মান একটি ডাটাবেস রেকর্ড মিলতে হবে।
  • সুতরাং অবশ্যই একটি টার্মিনো / টার্মক্যাপ ডাটাবেস থাকতে হবে। সাবসিস্টেমের কিছু বাস্তবায়নের ক্ষেত্রে, TERMCAPপরিবেশ পরিবর্তনশীল ব্যবহার করে টার্মক্যাপ ডাটাবেসের অবস্থান নির্দিষ্ট করা যেতে পারে । সুতরাং কিছু বাস্তবায়নের ক্ষেত্রে দ্বিতীয় পরিবেশের পরিবর্তনশীল রয়েছে।
  • টার্মক্যাপ / টার্মিনো রেকর্ডটিতে অবশ্যই বলা উচিত যে টার্মিনাল ধরণের রং সমর্থন করে। max_colorsটার্মিনফোতে একটি ক্ষেত্র আছে। এটি টার্মিনাল ধরণের জন্য সেট করা নেই যা প্রকৃতপক্ষে রঙের ক্ষমতাগুলি নয়। প্রকৃতপক্ষে, একটি টার্মিনো কনভেনশন রয়েছে যে প্রতিটি কলুষিত টার্মিনাল টাইপের জন্য আরও একটি রেকর্ড থাকে -mবা -monoনামের সাথে সংযোজন করা হয় যা কোনও রঙের ক্ষমতা বলে না।
  • টার্মক্যাপ / টার্মিনো রেকর্ড অবশ্যই প্রোগ্রামের রঙ পরিবর্তন করার উপায় সরবরাহ করবে। আছে set_a_foregroundএবং set_a_backgroundterminfo ক্ষেত্র।

এটি কেবল চেকিংয়ের চেয়ে কিছুটা জটিল isatty()। এটি বেশ কয়েকটি বিষয় আরও জটিল করে তুলেছে :

  • কিছু অ্যাপ্লিকেশন কমান্ড-লাইন বিকল্পগুলি বা কনফিগারেশন পতাকাগুলি যুক্ত করে যা চেকটিকে ওভাররাইড করে isatty(), যাতে প্রোগ্রামটি সর্বদা বা কখনই ধরে না নেয় যে এটির আউটপুট হিসাবে এটি একটি (শ্রদ্ধেয়) টার্মিনাল রয়েছে। উদাহরন স্বরূপ:
    • গনুহ lsহয়েছে --colorকম্যান্ড-লাইন বিকল্প।
    • বিএসডি (এর অনুপস্থিতির অর্থ কখনই নয় ) এবং (এর উপস্থিতিটির অর্থ সর্বদা ) পরিবেশের ভেরিয়েবলগুলি lsদেখায় এবং কমান্ড-লাইন বিকল্পটিও খেলাধুলা করে ।CLICOLORCLICOLOR_FORCE-G
  • কিছু অ্যাপ্লিকেশন টার্মক্যাপ / টার্মিনফো ব্যবহার করে না এবং এর মানটির প্রতি কঠোর প্রতিক্রিয়া জানায় TERM
  • সমস্ত টার্মিনালগুলি ECMA-48 বা আইএসও 8613-6 এসজিআর সিকোয়েন্সগুলি ব্যবহার করে না, যা রঙ পরিবর্তনের জন্য কিছুটা ভুল-নাম দেওয়া "এএনএসআই এস্কেপ সিকোয়েন্সস" রয়েছে। টার্মক্যাপ / টার্মিনো মেকানিজম প্রকৃতপক্ষে সঠিক নিয়ন্ত্রণের ক্রমগুলির সরাসরি জ্ঞান থেকে অ্যাপ্লিকেশনগুলি অন্তরক করার জন্য তৈরি করা হয়েছে। ( তদ্ব্যতীত , এখানে একটি যুক্তি রয়েছে যে কেউ আইএসও 8613-6 এসজিআর সিকোয়েন্স ব্যবহার করে না , কারণ প্রত্যেকে আরজিবি রঙ এসজিআর সিকোয়েন্সগুলির জন্য ডিলিমিটার হিসাবে আধা-কোলন ব্যবহার করার বাগের সাথে সম্মত হয় The মানকটি আসলে কোলন নির্দিষ্ট করে)

উল্লিখিত হিসাবে, জিএনইউ grepপ্রকৃতপক্ষে এই অতিরিক্ত কিছু জটিলতা প্রদর্শন করে। এটি টার্মক্যাপ / টার্মিনফোর সাথে পরামর্শ করে না, নির্গমন করার জন্য কন্ট্রোল সিকোয়েন্সগুলিকে শক্তিশালী করে এবং TERMপরিবেশের পরিবর্তনশীলটির প্রতিক্রিয়াটিকে হার্ডওয়ার করে ।

এটি লিনাক্স / ইউনিক্স বন্দর এই কোড আছে , যা colourization সম্ভব শুধুমাত্র যখন TERMএনভায়রনমেন্ট ভেরিয়েবল বিদ্যমান এবং এর মান hardwired নাম সাথে মেলে না dumb:

int- এ
should_colorize (অকার্যকর)
{
  চর কনস্ট * টি = গেটেনভ ("টিআরএম");
  t && strcmp (t, "dumb")! = 0;
}

সুতরাং আপনার যদি TERMহয় তবে xterm-monoজিএনইউ grepরঙ নির্গমন করার সিদ্ধান্ত নেবে, যদিও অন্যান্য প্রোগ্রামগুলি যেমন vimতা করবে না।

এর উইন 32 পোর্টটিতে এই কোডটি রয়েছে , যা TERMপরিবেশের পরিবর্তনশীল উপস্থিত না থাকলে বা যখন এটি উপস্থিত থাকে এবং এর মান হার্ডওয়ার্ড নামের সাথে মেলে না, তখন কলরাইজেশন সক্ষম করে dumb:

int- এ
should_colorize (অকার্যকর)
{
  চর কনস্ট * টি = গেটেনভ ("টিআরএম");
  ফিরে! (t && strcmp (t, "বোবা") == 0);
}

গনুহ grepরঙ দিয়ে এর সমস্যার

গনুহ grepএর colourization আসলে কুখ্যাত। কারণ এটি টার্মিনাল আউটপুট নির্মাণের পক্ষে যথাযথ কাজ করে না, বরং কেবলমাত্র শক্ত প্রতিশ্রুতিতে এর আউটপুটে বিভিন্ন পয়েন্টে কয়েকটি হার্ডওয়ার্ড কন্ট্রোল সিকোয়েন্সগুলিকে দোষ দেয় যে এটি যথেষ্ট ভাল, এটি নির্দিষ্ট পরিস্থিতিতে ভুল আউটপুট প্রদর্শন করে।

এই পরিস্থিতিতে এটি যখন টার্মিনালের ডান হাতের মার্জিনে থাকা কোনও কিছুকে কৌলাইজ করতে হয়। প্রোগ্রামগুলি যে টার্মিনাল আউটপুট সঠিকভাবে করে তাদের স্বয়ংক্রিয় ডান মার্জিনের জন্য অ্যাকাউন্ট করতে হয়। টার্মিনালটি সেগুলি না রাখার সামান্য সম্ভাবনা ছাড়াও (যেমন auto_right_marginটার্মিনোতে ক্ষেত্র), টার্মিনালগুলির আচরণগুলির মধ্যে স্বয়ংক্রিয় ডান মার্জিন থাকে এমন লাইন র‌্যাপের অপেক্ষার ডিসি ভিটি নজির অনুসরণ করে । গনুহ grepএই হিসাব না, naively আশা করে অবিলম্বে লাইন মোড়ানো , এবং তার রঙ্গিন আউটপুট গোলমাল।

রঙিন আউটপুট কোনও সাধারণ জিনিস নয়।

আরও পড়া


2
আমি এটি বুঝতে পারি যে আউটপুট পুনঃনির্দেশিত হলে ওপি আচরণের পরিবর্তন সম্পর্কে জিজ্ঞাসা করছে; $TERMযে ব্যাখ্যা না। (আপনার উত্তরটি সাধারণভাবে আকর্ষণীয়, তবে আমি মনে করি না যে এটি প্রশ্নের সমাধান করে ...)
স্টিফেন কিট

অনেক আগ্রহব্যাঞ্জক. আমি প্রোগ্রামগুলি কীভাবে আবিষ্কার করে (বা কেবল "সিদ্ধান্ত") কয়েক মাস ধরে টার্মিনালের ক্ষমতা কী তা নিয়ে আমি এর মতো একটি ওভারভিউ চাইছি। এটি এর অন্তর্দৃষ্টি দেয় যে এর মতো ওভারভিউটি খুঁজে পাওয়া কেন এত কঠিন - কারণ প্রতিটি প্রোগ্রাম এটি অন্যরকমভাবে সম্পাদন করে বলে মনে হচ্ছে।
the_velour_fog

পার্শ্ববর্তী লাইনের মোড়ক এবং তাত্ক্ষণিকভাবে লাইন মোড়কের পার্থক্য প্রদর্শনের জন্য উদাহরণের সাথে কী বোঝানো হয়েছে তার ব্যাখ্যাটি দুর্দান্ত ।
মস্কি

0

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

আপনি এটি এর মতো ব্যবহার করবেন:

unbuffer myshellscript.sh | grep value

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

unbuffer ansible-playbook myplaybook.yml | ctee /var/log/ansible/run-$( date "+%F" ).log
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.