লাল রঙে ব্যাশ ডিসপ্লে স্ট্ডার বার্তা তৈরি করার কোনও উপায় আছে কি ?
function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') }
জন্য কাজ করে। এটি উত্তর বি / সি খ্যাতি হিসাবে যুক্ত করতে পারে না।
লাল রঙে ব্যাশ ডিসপ্লে স্ট্ডার বার্তা তৈরি করার কোনও উপায় আছে কি ?
function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') }
জন্য কাজ করে। এটি উত্তর বি / সি খ্যাতি হিসাবে যুক্ত করতে পারে না।
উত্তর:
command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
>&2
ডান আগে যুক্ত করে ; done)
, stderr এর উদ্দেশ্যে আউটপুটটি আসলে stderr তে লেখা হয়। আপনি যদি প্রোগ্রামটির স্বাভাবিক আউটপুট ক্যাপচার করতে চান তবে এটি সহায়ক।
tput
, এবং আমার মতে কিছুটা বেশি পঠনযোগ্য:command 2> >(while read line; do echo -e "$(tput setaf 1)$line$(tput sgr0)" >&2; done)
IFS= read -r line
সাহায্য করা উচিত কিন্তু না। নিশ্চিত কেন।
পদ্ধতি 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
।zsh
?
zsh: color()(set -o pipefail;"$@" 2>&1 1>&3|sed $'s,.*,\e[31m&\e[m,'1>&2)3>&1
আপনি স্টার্ডার্ডগুলিও দেখতে পারেন: https://github.com/sickill/stderred
.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 এর জন্য ফন্টের রঙ কীভাবে সেট করবেন
source ~/.bashrc
এটির সাথে দু'বার করে থাকি তবে আমার টার্মিনালটি মূলত লক হয়ে যায়।
আমি একটি মোড়ক স্ক্রিপ্ট তৈরি করেছি যা বালেজ পোজসারের উত্তরকে খাঁটি বাশে প্রয়োগ করে। এটিকে আপনার আউটপুট রঙিন করার জন্য আপনার $ 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
আপনি এই মত একটি ফাংশন ব্যবহার করতে পারেন
#!/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 সংযোজন করি
আমার কাছে 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
এই সমাধানটি আমার পক্ষে কাজ করেছে: 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 করতে
এক্সার্গস এবং প্রিন্টফ ব্যবহার করে:
command 2> >(xargs -0 printf "\e[31m%s\e[m" >&2)