প্রশ্ন bash: লাল রং মুদ্রণ stderr


বাশ প্রদর্শন করতে একটি উপায় আছে দ্বারা stderr লাল রঙের বার্তা?


99
2017-08-26 21:10


উত্স


আমি মনে করি bash তার আউটপুট রঙিন করবে না: কিছু প্রোগ্রাম কিছু বিশ্লেষণ করতে চান, এবং colorizing পালানো ক্রম সঙ্গে তথ্য নষ্ট করা হবে। একটি GUI অ্যাপ্লিকেশন রঙ হ্যান্ডেল করা উচিত, আমি অনুমান। - kolypto
বেলজ্স পজসার এবং কিলড্যাশ 9 এর জবাবের সাথে একত্রিত করা হচ্ছে খাস্তা: function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') }  Bash এবং zsh জন্য কাজ করে। একটি উত্তর b / সি খ্যাতি হিসাবে এই যোগ করতে পারবেন না। - Heinrich Hartmann
আমি একটি উত্তর জন্য অপেক্ষা করছি যে এই কাজ করতে bash পরিবর্তন। সব নীচে সমাধান প্রকৃতপক্ষে stderr পরিবর্তন এবং সম্ভবত এটি w.r.t. stderout যা স্টারডারের সঠিক বাইট ক্রম সংরক্ষণ করা উচিত জিনিসগুলি ভেঙে যেমন। পাইপ যখন। - masterxilo


উত্তর:


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

84
2017-08-26 21:39



গ্রেট! কিন্তু আমি এটা স্থায়ী করতে একটি উপায় আছে যদি আশ্চর্য :) - kolypto
গ্রেট টিপ! পরামর্শ: যোগ করে >&2 ঠিক আগে ; done), stderr জন্য উদ্দেশ্যে আউটপুট আসলে stderr লেখা হয়। আপনি প্রোগ্রামের স্বাভাবিক আউটপুট ক্যাপচার করতে চান যে সহায়ক। - henko
নিম্নলিখিত ব্যবহার tput, এবং আমার মতামত সামান্য আরো পঠনযোগ্য: command 2> >(while read line; do echo -e "$(tput setaf 1)$line$(tput sgr0)" >&2; done) - Stefan Lasiewski
আমি প্রতিটি আউটপুট লাইন জন্য 2 টিপুন প্রসেস এক্সিকিউটিভ মনে সব মার্জিত নয়। হয়তো আপনি একটি পরিবর্তনশীল মধ্যে টিপুন কমান্ড আউটপুট সংরক্ষণ এবং প্রতিটি প্রতিধ্বনি জন্য যারা ব্যবহার করতে পারে। কিন্তু তারপর আবার, পঠনযোগ্যতা সত্যিই ভাল নয়। - Balázs Pozsár
এই সমাধানটি হোয়াইটস্পেস সংরক্ষণ করে না তবে আমি এটির সংক্ষিপ্তত্বের জন্য এটি পছন্দ করি। IFS= read -r line সাহায্য করা উচিত কিন্তু না। কেন নিশ্চিত না। - Max Murphy


পদ্ধতি 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 - এটি একটি শেল বিকল্প যা কমান্ডের ত্রুটির রিটার্ন কোড সংরক্ষণ করে যার আউটপুটটি অন্য কমান্ডে পাইপ করা হয়। এটি একটি উপশিলে সম্পন্ন করা হয় যা বন্ধনী দ্বারা তৈরি করা হয়, যাতে বাইরের শেলের পাইপফেল বিকল্পটি পরিবর্তন না করা হয়।
  • "$@" - একটি নতুন কমান্ড হিসাবে ফাংশন আর্গুমেন্ট এক্সিকিউট। "$@" সমতুল্য "$1" "$2" ...
  • 2>&1 - পুনঃনির্দেশিত stderr কমান্ড stdout যাতে এটা হয়ে যায় sedএর stdin
  • >&3 - জন্য শর্টান্ডা 1>&3, এই পুনঃনির্দেশ stdout একটি নতুন অস্থায়ী ফাইল বর্ণনাকারী 33 ফিরে ফিরে রুট পায় stdout পরে।
  • sed ... - উপরের পুনঃনির্দেশের কারণে, sedএর stdin হয় stderr মৃত্যুদন্ড কার্যকর আদেশ। এর ফাংশন রঙ কোড দিয়ে প্রতিটি লাইন ঘিরে।
  • $'...' একটি bash গঠন যা এটি ব্যাকস্ল্যাশ-পালানো অক্ষর বুঝতে কারণ
  • .* - সম্পূর্ণ লাইন মেলে।
  • \e[31m - নিম্নোক্ত অক্ষরগুলি লাল হতে পারে এমন ANSI পাল্টা ক্রম
  • & - দ্য sed সম্পূর্ণ মিলিত স্ট্রিং (এই ক্ষেত্রে সমগ্র লাইন) প্রসারিত চরিত্র প্রতিস্থাপন করুন।
  • \e[m - রঙ রিসেট যে ANSI পালা ক্রম।
  • >&2 - জন্য শর্টান্ডা 1>&2, এই পুনঃনির্দেশ sedএর stdout থেকে stderr
  • 3>&1 - অস্থায়ী ফাইল বর্ণনাকারী পুনঃনির্দেশ 3 ফিরে stdout

74
2018-04-23 20:53



+1 সেরা উত্তর! নিখুঁতভাবে অন্তর্নিহিত! - muhqu
মহান উত্তর এবং এমনকি ভাল ব্যাখ্যা - Daniel Serodio
কেন আপনি সব অতিরিক্ত পুনঃনির্দেশনা করতে হবে? overkill মত মনে হয় - qodeninja
@ কদদিনিনজা ব্যাখ্যাটি পুনঃনির্দেশনের উদ্দেশ্যটি দেয়। যদি আপনি এটি করতে একটি সহজ উপায় খুঁজে পেতে পারেন, আমি এটা দেখতে চাই! - killdash9
এটা কাজ করতে একটি উপায় আছে zsh? - Eyal Levin


আপনি stderred চেক আউট করতে পারেন: https://github.com/sickill/stderred


23
2017-12-13 21:40



বাহ, এই ইউটিলিটিটি দুর্দান্ত, একমাত্র জিনিস যা এটি প্রয়োজন তা হল একটি উপযুক্ত রিপোজিটরি যা সমস্ত ব্যবহারকারীর জন্য এটি ইনস্টল করে, এক লাইন সহ, এটি সক্ষম করতে আরও বেশি কাজ না করে। - sorin
যখন আমি একটি পৃথক টার্মিনালে একটি বিল্ড স্ক্রিপ্ট দিয়ে এটি পরীক্ষা করেছি তখন ভালভাবে কাজ করার কথা বলেছি, তবে আমি বিশ্বব্যাপী এটি ব্যবহার করতে দ্বিধান্বিত .bashrc)। ধন্যবাদ যদিও! - Joel Purra
ওএস এক্স এল ক্যাপিটানে, এই কাজটি (DYLD_INSERT_LIBRARIES) পদ্ধতিটি বাইনারিগুলিতে "ভাঙা" হয় কারণ এটি SIP দ্বারা সুরক্ষিত। সুতরাং অন্যান্য উত্তর দেওয়া ব্যাশ অপশন ব্যবহার করা ভাল হতে পারে। - hmijail
ম্যাকস এর জন্য @ হিমিজাইল অনুগ্রহ করে অনুসরণ করুন github.com/sickill/stderred/issues/60 তাই আমরা একটি workaround খুঁজে পেতে পারেন, একটি আংশিক এক ইতিমধ্যে বিদ্যমান কিন্তু একটি সামান্য বিট হয়। - sorin


http://sourceforge.net/projects/hilite/


14
2017-08-26 21:18





তৈরি করার bash উপায় দ্বারা stderr স্থায়ীভাবে লাল স্ট্রিম পুনঃনির্দেশ করার জন্য 'exec' ব্যবহার করা হয়। আপনার bashrc এ নিচের যোগ করুন:

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 এর জন্য ফন্টের রঙ সেট করবেন


11
2018-01-29 08:49



সম্পর্কিত: unix.stackexchange.com/questions/367636/... - Blauhirn
এই দূরে দ্বারা সেরা উত্তর; ইনস্টলেশন ছাড়া সহজলভ্য / সুডো বিশেষাধিকার প্রয়োজন, এবং সমস্ত কমান্ডের সাধারণীকরণ করা যেতে পারে। - Luke Davis
দুর্ভাগ্যবশত এটি কমান্ড চেইনিং (কমান্ড & পরবর্তী কম্যান্ড || errorHandlerCommand) এর সাথে ভাল খেলতে পারে না। ত্রুটি আউটপুট ErrorHandlerCommand আউটপুট পরে যায়। - carlin.scott
একইভাবে, যদি আমি source ~/.bashrc এই সঙ্গে দুবার, আমার টার্মিনাল মূলত তালা আপ। - Dolph
@ ডলফ: আমার ব্যাশ্র্কে এই কোডটি পুনঃলোড থেকে রোধ করার জন্য আমি আশেপাশের বিবৃতির সাথে সহজেই এটির বিরুদ্ধে সতর্ক থাকি। অন্যথায়, সমস্যাটি পুনঃনির্দেশনা ইতিমধ্যে সঞ্চালিত হওয়ার পরে 'পুনঃনির্দেশ 9> & 2' সমস্যাটি পুনঃনির্দেশিত। সম্ভবত আপনি যদি জানেন যে> 2 মূলত নির্দেশ করে যেখানে এটি একটি ধ্রুবক পরিবর্তন। - gospes


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


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

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

    # টেম্প ফাইল সব ভুল ধরা
    TMP_ERRS = $ (mktemp)

    # কমান্ড চালানো
    "$ @" 2>> ((লাইন পড়ার সময়; echo -e "\ e [01; 31m $ line \ e [0m" | tee --append $ TMP_ERRS; সম্পন্ন করুন)
    EXIT_CODE = $?

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

    # শেষ
    $ EXIT_CODE প্রস্থান করুন


7
2017-08-26 22:13



"কাজ করা" এর পরে "| tee ..." রাখা হলে এটি আরও কার্যকর করা যেতে পারে। - Juliano


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


 #!/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


3
2017-08-26 22:29



সমস্যা মোকাবেলা করা হয় না। আপনি stdout থেকে stderr আলাদা করার উপায় সরবরাহ করেন নি, যা ওপিকে আগ্রহী। - Jeremy Visser


আমি 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
2018-06-08 17:37





এই সমাধান আমার জন্য কাজ করেছে: https://superuser.com/questions/28869/immediately-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

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


1
2017-08-25 09:16





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

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

0
2018-06-04 10:04





xargs এবং printf ব্যবহার করে:

command 2> >(xargs -0 printf "\e[31m%s\e[m" >&2)

0
2017-08-23 13:37