বাশ প্রম্পটের জন্য কোনও ফাংশনে মুদ্রণবিহীন অক্ষরগুলি এড়িয়ে চলুন


22

বাশ প্রম্পটে (পিএস 1 ভেরিয়েবল), আমি প্রম্পটে সম্ভাব্যভাবে পাঠ্য যুক্ত করার জন্য একটি ফাংশন বলছি: export PS1="\u@\h \$(my_function) \$ "

তবে প্রম্পটে ফাংশনটিতে এএনএসআই রঙের কোড রয়েছে যা ফাংশনের আউটপুট (কখনও কখনও লাল, কখনও কখনও সবুজ) এর ভিত্তিতে পরিবর্তিত হয়। যোগ করার পদ্ধতি " \[" PS1 পরিবর্তনশীল অ প্রিন্টিং হিসাবে যারা কোডগুলি অব্যাহতি উচিত, কিন্তু যদি আমি একটি কি echoফাংশনে, " \[" -এর আক্ষরিক প্রম্পট ছাপা হয়।

ব্যাশ প্রম্পটে ব্যবহারের জন্য কোনও ফাংশনের মধ্যে থেকে আমি কীভাবে এই এএনএসআই রঙ কোডগুলি এড়াতে পারি?

উত্তর:


34

Readline গ্রন্থাগার গ্রহণ \001এবং \002(হওয়া ASCII SOH এবং STX ) মুদ্রণযোগ্য নয় এমন পাঠ্য বিভেদক রূপে। এগুলি রিডলাইন ব্যবহার করে এমন কোনও অ্যাপ্লিকেশনটিতেও কাজ করে ।

থেকে lib/readline/display.c:243ব্যাশ সোর্স কোড:

243 /* Current implementation:
244         \001 (^A) start non-visible characters
245         \002 (^B) end non-visible characters
246    all characters except \001 and \002 (following a \001) are copied to
247    the returned string; all characters except those between \001 and
248    \002 are assumed to be `visible'. */

ব্যাশ -specific \[এবং \]আসলে অনুবাদ করা হয় \001এবং \002y.tab.c:7640


দ্রষ্টব্য: আপনি ব্যবহার করেন তাহলে ব্যাশ 'র printfবা echo -e, এবং আপনার টেক্সট হয়েছে থাকে \001বা \002অবিলম্বে নম্বরের আগে, আপনি একটি আঘাত করব ব্যাশ বাগ যখন প্রক্রিয়াকরণের অকট্যাল বেরিয়ে এটা এক অঙ্ক অনেকগুলি খেতে ঘটায় যে - যে, \00142অকট্যাল হিসেবে ব্যাখ্যা করা হবে 014 (ASCII "2" এর পরে), সঠিক অষ্টাল 01 এর পরিবর্তে (ASCII "42" এর পরে)। এই কারণে, হেক্সাডেসিমাল সংস্করণ \x01এবং \x02পরিবর্তে ব্যবহার করুন।


এটা করে! echo -e "\001\e[31m\002RED"প্রত্যাশার মতো কাজ করে। ধন্যবাদ!
মিডনাইটলাইটিং

কোনও উত্তর পুনরুত্থিত করার জন্য দুঃখিত, তবে ড্যাশ / অ্যাশ / এস এর সমতুল্য কী?
হোশ সাদিক

@Hosh যদি তারা readline ব্যবহার করেন, \001এবং \002কাজ করবে। নইলে আমি নিশ্চিত নই। উদাহরণস্বরূপ ড্যাশগুলি অবশ্যই পঠনরেখা ব্যবহার করে না
wjandrea

1

এখানে একটি সুন্দর সম্পূর্ণ উত্তর। \ 001 ইত্যাদি কোথায় যেতে হয়েছিল তা নির্ধারণ করতে আমাকে আরও অনেক খনন করতে হয়েছিল। আশাকরি এটা সাহায্য করবে.

# Color prompt for git
reset=$(tput sgr0)
boldgreen=$(tput setaf 2)$(tput bold)
cyan=$(tput sgr0)$(tput setaf 6)
boldred=$(tput setaf 1)$(tput bold)
boldwhite=$(tput setaf 7)$(tput bold)
boldyellow=$(tput setaf 3)$(tput bold)

PARENCLR=$'\001\e[0;36m\002'
BRANCHCLR=$'\001\e[1;33m\002'

alias branchname="git branch 2>/dev/null | grep '*' | sed 's/* \(.*\)/ ${PARENCLR}(${BRANCHCLR}\1${PARENCLR}\)/'"

GIT_STATUS='$(branchname)'

PROMPT_CHAR="\$"
PS1="\[$boldgreen\]\u\[$cyan\]::\[$boldred\]\h \[$cyan\]{\[$boldwhite\].../\W\[$cyan\]}\[$reset\]$GIT_STATUS\[$reset\]$PROMPT_CHAR "

আমি এটি যেভাবে এখানে সেট আপ করেছি, গিট শাখা বন্ধনীগুলি কেবলমাত্র যদি আপনি গিট শাখায় থাকেন তবে উপস্থিত হয় অন্যথায় এটি ফাঁকা থাকে।


0

মহাকর্ষের উত্তরের ভিত্তিতে , নিম্নলিখিতগুলি ASCII SOH( ^A) এবং STX( ^B) এ এএনএসআই নিয়ন্ত্রণের অনুক্রমগুলি সংযুক্ত করবে যা যথাক্রমে \[এবং \]যথাক্রমে:

function readline_ANSI_escape() {
  if [[ $# -ge 1 ]]; then
    echo "$*"
  else
    cat  # Read string from STDIN
  fi | \
  perl -pe 's/(?:(?<!\x1)|(?<!\\\[))(\x1b\[[0-9;]*[mG])(?!\x2|\\\])/\x1\1\x2/g'
}

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

$ echo $'\e[0;1;31mRED' | readline_ANSI_escape

বা:

$ readline_ANSI_escape "$string"

বোনাস হিসাবে, একাধিক বার ফাংশনটি চালানো ইতিমধ্যে নিয়ন্ত্রণ কোডগুলি থেকে রেহাই পাবে না।


-2

আপনি যদি প্রম্পটে এগুলি ব্যবহার করতে চান তবে আপনার এটি করা দরকার \[। তবে আপনি যদি এটি প্রতিধ্বনিতে ব্যবহার করতে চান তবে আপনাকে ব্যবহার করতে হবে \033[


হুমম ... ... প্রম্পটে পরবর্তী মুদ্রিত অক্ষরটি প্রিন্ট নয় বলে মনে হওয়ার পরে [এএনএসআই কমান্ডের আগে "" \ ই [31 মি ") এবং \ 033] যুক্ত করা হচ্ছে।
মিডনাইটলাইটিং

1
আপনি এর পরে \ 033] করতে চান না। \ 033 [31 মি রঙ শুরু হয়, এর পরে আপনাকে এটিকে আবার \ 033 দিয়ে সেট করতে হবে [0 মি
ওফার্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.