PS1 এর জন্য টার্মিনাল রঙের কোডগুলি সঞ্চয় করতে ভেরিয়েবল ব্যবহার করছেন?


33

আমার মধ্যে .bashrc, আমি বিভিন্ন বিট রঙিন করতে এএনএসআই টার্মিনাল রঙ কোড ব্যবহার করি use দেখে মনে হচ্ছে:

PS1='\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ '

যেখানে virtual_envএবং git_branchযে আউটপুট কাপড় stdout- এ তে ব্যাশ ফাংশন আছে।

এখন, পড়া এবং সংশোধন করা আরও সহজ করার জন্য, আমি রং কোডগুলি ভেরিয়েবলগুলিতে সঞ্চয় করতে এবং এগুলিতে সরাসরি এম্বেড করার পরিবর্তে সেগুলি উল্লেখ করতে চাই PS1। সুতরাং আমি এই মত ভেরিয়েবল একটি গুচ্ছ আছে:

GREEN="\[\033[32m\]"
YELLOW="\[\033[33m\]"
RESET="\[\033[0m\]"

আমি কিছু লিখতে সক্ষম হতে চাই:

PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ '

তবে এটি কার্যকর হয় না - বর্ণ কোডগুলি প্রম্পটে প্রদর্শিত হয়, যেমন তারা পালিয়ে যায়। আমি এর পরিবর্তে ডাবল উদ্ধৃতি ব্যবহার করি তবে রংগুলি সঠিকভাবে কাজ করে PS1, তবে তখনই আমি প্রম্পটটি পরিবর্তিত হয় source ~/.bashrc

আমি অন্য কিছু আমি দেখেছি মানুষ না চেষ্টা করেছি - ব্যবহার printf, রং জন্য একক উদ্ধৃতি ব্যবহার করে, নির্বাণ \[এবং \]PS1রঙ পরিবর্তনশীল পরিবর্তে, কিন্তু কিছুই কাজ মনে হয়।

আমি কীভাবে রঙের কোডগুলির জন্য ভেরিয়েবল ব্যবহার করতে পারি?


আপনি আমাদের দিতে পারেন .bashrc?
cuonglm

@cuonglm আপনার সমস্ত .brcrc আমাদের অন্তর্ভুক্ত? আমি নিজেকে দেখাতে হবে।
সিভিফ্যান 25'16

উত্তর:


20

সমাধানটি হ'ল প্রম্পটটি সংজ্ঞায়িত করার সময় শেলটি রঙের ভেরিয়েবলের বিকল্প হিসাবে নেওয়া, তবে কার্যকারিতা নয়। এটি করার জন্য, ডাবল উদ্ধৃতিগুলি ব্যবহার করুন যেমন আপনি মূলত চেষ্টা করেছিলেন তবে কমান্ডগুলি এড়িয়ে চলুন যাতে প্রম্পটটি আঁকানো না হয় ততক্ষণ তাদের মূল্যায়ন করা হবে না।

PS1="\u@\h:\w${YELLOW}\$(virtual_env)${GREEN}\$(git_branch)${RESET}$ "

প্রতিটি কমান্ডের \আগে লক্ষ্য করুন $()

যদি আমরা এটি প্রতিধ্বনিত করি তবে আমরা দেখতে পাই:

echo "$PS1"
\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ 

আপনি দেখতে পাচ্ছেন, বর্ণের পরিবর্তনগুলি পরিবর্তিত হয়েছে, তবে আদেশগুলি নয়।


1
Work (গিট_ব্রাঞ্চ) এছাড়াও section {পাতলা} ইত্যাদি ব্যবহার করে মুদ্রণ করতে চাইলে এটি কাজ করছে বলে মনে হচ্ছে না, আপনি এখনও সমস্ত [] অক্ষর পাবেন।
ডাব্লুবি রিড

7

সমস্যাটি হ'ল আপনার পরিবর্তনশীল GREEN চলকটিতে "ব্যাকস্ল্যাশ বন্ধনী ব্যাকস্ল্যাশ শূন্য তিন তিন" এবং আরও অনেকগুলি সমন্বিত আক্ষরিক স্ট্রিং রয়েছে। এতে আপনার টার্মিনালটির রঙ পরিবর্তন করার জন্য প্রয়োজনীয় কোনও ASCII পলায়ন চরিত্র নেই।

আপনি নিয়ন্ত্রণের অক্ষরগুলিকে ম্যানুয়ালি GREEN(এবং YELLOWএবং RESET) রেখে দিতে পারেন, তবে এর চেয়ে আরও ভাল বিকল্পটি tputপ্রথম স্থানে ব্যবহার করা হয় যাতে আপনার কোনও হার্ড কোডের প্রয়োজন না হয় এবং আপনি কোনও টার্মিনাল টাইপ সমর্থন করবেন।

GREEN="$(tput setaf 2)"
YELLOW="$(tput setaf 3)"
RESET="$(tput setaf 0)"

আপনি যখন "ব্যাকস্ল্যাশ শূন্য তিন তিন" ইত্যাদি স্থাপন করেন তখন এটি কেন বিশ্ব হয় ... সরাসরি PS1ব্যাকস্ল্যাশ অনুক্রমের ব্যাখ্যা ব্যাশের প্রম্প্টের বৈশিষ্ট্য (ম্যানুয়ালটিতে প্রম্পটিং বিভাগটি দেখুন। পরামিতি প্রসারণ, কমান্ডের আগে এই প্রতিস্থাপনটি ঘটে প্রতিস্থাপন, গাণিতিক সম্প্রসারণ, এবং উদ্ধৃতি অপসারণ যদিও এটি অন্যান্য সমস্ত ক্রিয়াকলাপের ফলাফলের জন্য প্রয়োগ হয় না।


5
এটি এইভাবে করার সময়, আপনাকে রঙের ভেরিয়েবলগুলি এর \[\]অভ্যন্তরে মোড়ানো প্রয়োজন $PS1। উদাহরণস্বরূপ: PS1='\u@\h:\w\[${YELLOW}\]'। যদি আপনি এটি না করেন এবং আপনি একটি দীর্ঘ কমান্ডটি শেষ করে যা পরবর্তী লাইনে আবদ্ধ হয়, আপনি সমস্ত ধরণের সমস্যার মুখোমুখি হবেন। শেলটি \[\]কোন অক্ষরগুলি মুদ্রণযোগ্য নয় তা নির্ধারণ করতে ব্যবহার করে , তাই এটি প্রম্পটের দৈর্ঘ্যের গণনায় ফ্যাক্ট করে না। এটিটির এটির প্রয়োজন তাই এটি টার্মিনালের প্রস্থের বেশি হলে সঠিকভাবে লাইনটি আঁকতে পারে।
প্যাট্রিক

tputধন্যবাদ জানতাম না । আমি আপাতত প্যাট্রিকের উত্তরটি ব্যবহার করব তবে আমি যখন সুযোগ পাব তখন আমি এটিকে আবার দেখাব।
ইসমাইল বাদোয়া

2

আপনি পূরণ করার উপায় পরিবর্তন করুন $ গ্রীন, $ ইয়েলো এবং ES রিসেট:

GREEN="$(echo -e "\033[32m")"
YELLOW="$(echo -e "\033[33m")"
RESET="$(echo -e "\033[0m")"

PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ '

1
এটি কার্যকরভাবে সেলাদের উত্তরের মতো একই কাজ করে। টার্মিনালটি রঙিন সেটিংয়ের জন্য বিভিন্ন এস্কেপ কোডগুলি ব্যবহার করে সেলেডা বেশি পোর্টেবল। মাল্টি-লাইন প্রম্পট জিনিসটির সাথেও এটি একই সমস্যা হতে চলেছে।
প্যাট্রিক

2
\[…\]বিট চাহিদা প্রম্পট থাকতে, আপনি একটি পরিবর্তনশীল এটা সামগ্রী করতে পারবে না। আপনি এটি পুরোপুরি সরিয়ে ফেলেছেন, যার ফলে ডিসপ্লে সমস্যা দেখা দেবে (কার্সার এমন অবস্থানে নেই যেখানে ব্যাশ এটি প্রত্যাশা করে)।
গিলস 23'40

@ পেট্রিক উদ্বেগগুলি বাদ দিয়ে প্রতিধ্বনি-পোর্টেবল নয়।
হেল্পারমেডো

1
অ-বহনযোগ্যতার সাথে আরও বৈশিষ্ট্য আসে - tput setafআপনাকে হালকা সায়ানের মতো রঙের "হালকা" সেট থেকে বেছে নিতে দেয় না। @ সাইরাস এর উত্তর অবশ্য দেয়।
সিভিফ্যান 25'16
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.