বাশ: লাল রঙে স্ট্যান্ডার প্রিন্ট করুন


122

লাল রঙে ব্যাশ ডিসপ্লে স্ট্ডার বার্তা তৈরি করার কোনও উপায় আছে কি ?


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

বালাজ পোজসার এবং কিলড্যাশ 9 উত্তরগুলির সংমিশ্রণটি খাস্তা দেয়: বাশ এবং জেডশির function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') } জন্য কাজ করে। এটি উত্তর বি / সি খ্যাতি হিসাবে যুক্ত করতে পারে না।
হেইনিখ হার্টম্যান

1
আমি এমন উত্তরের জন্য অপেক্ষা করছি যা এটি করার জন্য বাশকে পরিবর্তন করে। সমস্ত নীচের সমাধানগুলি আসলে স্ট্যাডারকে সংশোধন করে এবং সম্ভবত এটি স্ট্রাউটকে পুনরায় অর্ডার করে যা স্ট্রেডের সঠিক বাইট ক্রমটি সংরক্ষণ করতে হবে যখন পাইপিংয়ের সময় জিনিসগুলিকে ব্রেক করে।
মাস্টারেক্সিলো

উত্তর:


98
command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)

6
গ্রেট! তবে আমি ভাবছি এটি স্থায়ী করার কোনও উপায় আছে কিনা :)
কলিপ্টো

9
দুর্দান্ত টিপ! পরামর্শ: >&2ডান আগে যুক্ত করে ; done), stderr এর উদ্দেশ্যে আউটপুটটি আসলে stderr তে লেখা হয়। আপনি যদি প্রোগ্রামটির স্বাভাবিক আউটপুট ক্যাপচার করতে চান তবে এটি সহায়ক।
হেনকো

8
নিম্নলিখিত ব্যবহারগুলি tput, এবং আমার মতে কিছুটা বেশি পঠনযোগ্য:command 2> >(while read line; do echo -e "$(tput setaf 1)$line$(tput sgr0)" >&2; done)
স্টেফান লাসিউইস্কি

2
আমি মনে করি প্রতিটি আউটপুট লাইনের জন্য 2 টিপুট প্রক্রিয়া চালানো মোটেই মার্জিত নয়। সম্ভবত আপনি যদি tume কমান্ডের আউটপুট একটি ভেরিয়েবলের মধ্যে সঞ্চয় করেন এবং প্রতিটি প্রতিধ্বনির জন্য সেগুলি ব্যবহার করেন। তবে আবার, পাঠযোগ্যতা আসলে ভাল হয় না।
বালজ পোজসার 12

1
এই সমাধানটি হোয়াইটস্পেস সংরক্ষণ করে না তবে আমি এটির ব্রেভিটির জন্য এটি পছন্দ করি। IFS= read -r lineসাহায্য করা উচিত কিন্তু না। নিশ্চিত কেন।
ম্যাক্স মার্ফি

89

পদ্ধতি 1: প্রক্রিয়া বিকল্প ব্যবহার করুন:

command 2> >(sed $'s,.*,\e[31m&\e[m,'>&2)

পদ্ধতি 2: বাশ স্ক্রিপ্টে একটি ফাংশন তৈরি করুন:

color()(set -o pipefail;"$@" 2>&1>&3|sed $'s,.*,\e[31m&\e[m,'>&2)3>&1

এটি এর মতো ব্যবহার করুন:

$ color command

দুটি পদ্ধতিই কমান্ডটি stderrলাল দেখায় ।

পদ্ধতি 2 কীভাবে কাজ করে তার ব্যাখ্যার জন্য পড়তে থাকুন। এই কমান্ড দ্বারা প্রদর্শিত কিছু আকর্ষণীয় বৈশিষ্ট্য রয়েছে।

  • color()... - রঙ নামে একটি বাশ ফাংশন তৈরি করে।
  • set -o pipefail- এটি একটি শেল বিকল্প যা একটি কমান্ডের ত্রুটি রিটার্ন কোড সংরক্ষণ করে যার আউটপুট অন্য কমান্ডে পাইপ করা হয়। এটি একটি সাবশেলে করা হয়, যা প্রথম বন্ধনী দ্বারা তৈরি করা হয়, যাতে বাইরের শেলের মধ্যে পাইপফেল বিকল্পটি পরিবর্তন না করা।
  • "$@"- নতুন কমান্ড হিসাবে ফাংশনে যুক্তিগুলি কার্যকর করে utes "$@"সমতুল্য"$1" "$2" ...
  • 2>&1- পুনঃনির্দেশ stderrকমান্ডের stdoutযাতে এটি হয়ে sedএর stdin
  • >&3- শর্টহ্যান্ড এর জন্য 1>&3, এটি stdoutএকটি নতুন অস্থায়ী ফাইল বিবরণীতে পুনঃনির্দেশ করে 3। পরে 3ফিরে যেতে হবে stdout
  • sed ...- উপরে পুনঃনির্দেশ কারণে sedএর stdinহয় stderrমৃত্যুদন্ড কার্যকর কমান্ডের। রঙিন কোডগুলি সহ প্রতিটি লাইনকে ঘিরে এটির কার্যকারিতা।
  • $'...' একটি বাশ নির্মাণ যা এটি ব্যাকস্ল্যাশ-পলায়নযুক্ত অক্ষরগুলি বোঝার কারণ করে
  • .* - পুরো লাইন মেলে।
  • \e[31m - এএনএসআই অব্যাহতি ক্রম যার ফলে নিম্নলিখিত অক্ষরগুলি লাল হয়ে যায়
  • &- sedপ্রতিস্থাপনের অক্ষরটি পুরো মিলিত স্ট্রিংয়ে প্রসারিত (এই ক্ষেত্রে সম্পূর্ণ লাইন)।
  • \e[m - এএনএসআই এস্কেপ ক্রম যা রঙটি পুনরায় সেট করে।
  • >&2- জন্য সাধারণভাবে সংক্ষেপে 1>&2এই, পুননির্দেশনা sedএর stdoutজন্য stderr
  • 3>&1- অস্থায়ী ফাইল বর্ণনাকারীটিকে 3পুনরায় পুনর্নির্দেশ করে stdout

9
+1 সেরা উত্তর! নিখুঁতভাবে আন্ডাররেটেড!
মুহখ

3
দুর্দান্ত উত্তর এবং আরও ভাল ব্যাখ্যা
ড্যানিয়েল সেরোদিও

আপনাকে অতিরিক্ত সমস্ত পুনঃনির্দেশ কেন করতে হবে? ওভারকিলের মতো মনে হচ্ছে
কোডেনিনজা

1
এটিতে কাজ করার কোনও উপায় আছে কি zsh?
আইয়াল লেভিন

1
জেডএসএইচ শর্টহ্যান্ড পুনর্নির্দেশ ফর্মগুলি স্বীকৃতি দেয় না। এটির জন্য আরও আরও 1 টি প্রয়োজন, যেমন:zsh: color()(set -o pipefail;"$@" 2>&1 1>&3|sed $'s,.*,\e[31m&\e[m,'1>&2)3>&1
রেকিন

26

আপনি স্টার্ডার্ডগুলিও দেখতে পারেন: https://github.com/sickill/stderred


বাহ, এই ইউটিলিটি দুর্দান্ত, কেবলমাত্র এটির দরকার হবে একটি অ্যাপ্ট রিপোজিটরি যা এটি ব্যবহারকারীর জন্য এটি ইনস্টল করে একটি লাইনের সাথে, এটি সক্ষম করার জন্য আরও কাজ করতে হবে না।
সোরিন

আমি যখন এটি একটি পৃথক টার্মিনালে একটি বিল্ড স্ক্রিপ্ট দিয়ে পরীক্ষা করেছি তখন ভাল কাজ করার জন্য মনে হয়েছিল, তবে আমি বিশ্বব্যাপী (ইন .bashrc) এটি ব্যবহার করতে দ্বিধা বোধ করছি । ধন্যবাদ যদিও!
জোয়েল পুররা

2
ওএস এক্স এল ক্যাপাইটেনে, সিস্টেম বাইনারিগুলিতে এইভাবে কাজ করে (DYLD_INSERT_LIBRARIES) "ভাঙা" কারণ তারা এসআইপি দ্বারা সুরক্ষিত। সুতরাং অন্যান্য উত্তরে প্রদত্ত ব্যাশ বিকল্পগুলি ব্যবহার করা ভাল।
hmijail

1
ম্যাকোএসের জন্য @hmijail অনুগ্রহ করে github.com/sickill/stderred/issues/60 অনুসরণ করুন যাতে আমরা একটি কার্যকরী সন্ধান করতে পারি, একটি আংশিক ইতিমধ্যে উপস্থিত রয়েছে তবে কিছুটা বগি is
sorin

15

স্ট্যাডারকে স্থায়ীভাবে লাল করার ব্যাশ উপায় স্ট্রিমগুলি পুনর্নির্দেশের জন্য 'এক্সিকিউট' ব্যবহার করে। আপনার বাশার্কে নিম্নলিখিতগুলি যুক্ত করুন:

exec 9>&2
exec 8> >(
    while IFS='' read -r line || [ -n "$line" ]; do
       echo -e "\033[31m${line}\033[0m"
    done
)
function undirect(){ exec 2>&9; }
function redirect(){ exec 2>&8; }
trap "redirect;" DEBUG
PROMPT_COMMAND='undirect;'

আমি এর আগে পোস্ট করেছি: STDOUT এবং STDERR এর জন্য ফন্টের রঙ কীভাবে সেট করবেন



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

1
দুর্ভাগ্যক্রমে এটি কমান্ড শৃঙ্খলাবদ্ধ (কমান্ড ও & নেক্সটকম্যান্ড || ত্রুটিহ্যান্ডারকম্যান্ড) এর সাথে ভাল খেলছে না। ত্রুটি আউটপুট ত্রুটিহ্যান্ডার কম্যান্ড আউটপুট পরে যায়।
carlin.scott

1
একইভাবে, আমি যদি source ~/.bashrcএটির সাথে দু'বার করে থাকি তবে আমার টার্মিনালটি মূলত লক হয়ে যায়।
ডলফ

@ ডল্ফ: আমার বাশক্রিতে আমি সহজেই এই কোডটি পুনরায় লোড হওয়া থেকে রোধ করতে পার্শ্ববর্তী স্টেটমেন্ট দিয়ে এর বিরুদ্ধে রক্ষা করি। অন্যথায়, সমস্যাটি পুনঃনির্দেশ ইতিমধ্যে সংঘটিত হওয়ার পরে পুনর্নির্দেশ 'এক্সিকিউটিভ 9> & 2' is আপনি যদি জানেন যে> 2 মূলত ইশারা দিচ্ছে তবে সম্ভবত এটি একটি ধ্রুবকটিতে পরিবর্তন করুন।
গসপ্স


7

আমি একটি মোড়ক স্ক্রিপ্ট তৈরি করেছি যা বালেজ পোজসারের উত্তরকে খাঁটি বাশে প্রয়োগ করে। এটিকে আপনার আউটপুট রঙিন করার জন্য আপনার $ PATH এবং উপসর্গ কমান্ডে সংরক্ষণ করুন।

    #! / বিন / ব্যাশ

    যদি [$ 1 == "- সহায়তা"]; তারপর
        প্রতিধ্বনি "একটি কমান্ড কার্যকর করে এবং ঘটে যাওয়া সমস্ত ত্রুটি রঙিন করে"
        প্রতিধ্বনি "উদাহরণ:` বেসনাম $ {0} get উইজেট ... "
        প্রতিধ্বনি "(সি) ও_ও টিঙ্ক, আইসিকিউ # 1227-700, উপভোগ করুন!"
        প্রস্থান 0
        ফাই

    সমস্ত ত্রুটি ধরার জন্য # টেম্পল ফাইল
    TMP_ERRS = $ (mktemp)

    # কমান্ড কার্যকর করুন
    "$ @" 2>> (লাইন পড়ার সময়; ইকো-ই করুন "\ ই [01; 31 মি $ লাইন \ ই [0 মি" | টি - অ্যাপেন্ড $ টিএমপি_এআরআরএস; সম্পন্ন হয়েছে)
    EXIT_CODE = $?

    # সমস্ত ত্রুটি আবার প্রদর্শন করুন
    যদি [-s "$ TMP_ERRS"]; তারপর
        প্রতিধ্বনি- "" \ n \ n \ n \ e [01; 31 মি === এররস === \ ই [0 মি "
        বিড়াল $ TMP_ERRS
        ফাই
    rm -f $ TMP_ERRS

    # সমাপ্ত
    প্রস্থান করুন $ EXIT_CODE


2
"| টি ..." "সম্পন্ন" করার পরে রাখলে এটি আরও কার্যকর করা যায়।
জুলিয়ানো

3

আপনি এই মত একটি ফাংশন ব্যবহার করতে পারেন


 #!/bin/sh

color() {
      printf '\033[%sm%s\033[m\n' "$@"
      # usage color "31;5" "string"
      # 0 default
      # 5 blink, 1 strong, 4 underlined
      # fg: 31 red,  32 green, 33 yellow, 34 blue, 35 purple, 36 cyan, 37 white
      # bg: 40 black, 41 red, 44 blue, 45 purple
      }
string="Hello world!"
color '31;1' "$string" >&2

আমি স্ট্যান্ডারে মুদ্রণ করতে> এবং 2 সংযোজন করি


4
সমস্যার সমাধান না। আপনি স্টাডারকে স্টডআউট থেকে আলাদা করার কোনও উপায় সরবরাহ করেননি, যা ওপি আগ্রহী
জেরেমি ভিজার

1

আমার কাছে O_o Tync এর স্ক্রিপ্টটির কিছুটা পরিবর্তিত সংস্করণ রয়েছে। ওএস এক্স লায়নটির জন্য আমার এই মোডগুলি তৈরি করা দরকার এবং এটি নিখুঁত নয় কারণ মোড়কানো কমান্ডটি করার আগে স্ক্রিপ্টটি কখনও কখনও সম্পূর্ণ হয়। আমি একটি ঘুম যোগ করেছি তবে আমি নিশ্চিত যে এর থেকে আরও ভাল উপায় আছে।

#!/bin/bash

   if [ $1 == "--help" ] ; then
       echo "Executes a command and colorizes all errors occured"
       echo "Example: `basename ${0}` wget ..."
       echo "(c) o_O Tync, ICQ# 1227-700, Enjoy!"
       exit 0
       fi

   # Temp file to catch all errors
   TMP_ERRS=`mktemp /tmp/temperr.XXXXXX` || exit 1

   # Execute command
   "$@" 2> >(while read line; do echo -e "$(tput setaf 1)$line\n" | tee -a $TMP_ERRS; done)
   EXIT_CODE=$?

   sleep 1
   # Display all errors again
   if [ -s "$TMP_ERRS" ] ; then
       echo -e "\n\n\n$(tput setaf 1) === ERRORS === "
       cat $TMP_ERRS
   else
       echo "No errors collected in $TMP_ERRS"
   fi
   rm -f $TMP_ERRS

   # Finish
   exit $EXIT_CODE

1

এই সমাধানটি আমার পক্ষে কাজ করেছে: https://superuser.com/questions/28869/immittedly-tell- which-output-was-sent-to- stderr

আমি এই ফাংশনটি আমার .bashrcবা .zshrc:

# Red STDERR
# rse <command string>
function rse()
{
    # We need to wrap each phrase of the command in quotes to preserve arguments that contain whitespace
    # Execute the command, swap STDOUT and STDERR, colour STDOUT, swap back
    ((eval $(for phrase in "$@"; do echo -n "'$phrase' "; done)) 3>&1 1>&2 2>&3 | sed -e "s/^\(.*\)$/$(echo -en \\033)[31;1m\1$(echo -en \\033)[0m/") 3>&1 1>&2 2>&3
}

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

$ rse cat non_existing_file.txt

আমাকে একটি লাল আউটপুট দেবে।


পুনর্নির্দেশের প্রস্থান কোডের জন্য আপনি set -o pipefail;আগে যোগ করতে পারেন(eval
কেভিপস

এছাড়াও যোগ "আর্গুমেন্ট মধ্যে শূণ্যস্থান সংরক্ষণে Eval করতে
kvaps


0

ফিফোস ব্যবহার করে একটি সংস্করণ

mkfifo errs
stdbuf -o0 -e0 -i0 grep . foo | while read line; do echo -e "\e[01;31m$line  \e[0m" >&2; done &
stdbuf -o0 -e0 -i0 sh $script 2>errs
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.