গিলস আপনার মূল সমস্যাটি সনাক্ত করেছে, তবে আমি এটিকে অন্যভাবে ব্যাখ্যা করার চেষ্টা করতে চেয়েছিলাম।
ব্যাশ ব্যাখ্যা করে বিশেষ প্রম্পট বেরিয়ে শুধুমাত্র সামনে প্রম্পট কোনো ভেরিয়েবল বিস্তৃত। এর অর্থ \eহ'ল প্রম্পট থেকে প্রসারিত কোনও চলকটি ব্যবহার করা কার্যকর হয় না, যদিও এটি সরাসরি কাজ করে PS1।
উদাহরণস্বরূপ, এটি প্রত্যাশার মতো কাজ করে এবং লাল পাঠ্য দেয়:
PS1='\e[1;31m this is in red '
তবে এটি তা নয়, এটি \eপ্রম্পটে কেবল একটি আক্ষরিক রাখে :
RED='\e[1;31m'
PS1="$RED not in red "
আপনি যদি ভেরিয়েবলের মধ্যে রঙের পলায়ন সংরক্ষণ করতে চান তবে আপনি ভেরিয়েবেলে $'...'আক্ষরিক অব্যাহতি অক্ষর রাখার জন্য এএনএসআই-সি উদ্ধৃতি ( ) ব্যবহার করতে পারেন ।
এই কাজের জন্য, আপনি আপনার সংজ্ঞা পরিবর্তন করতে পারেন GREEN, REDএবং NONE, তাই তাদের মূল্য প্রকৃত পালাবার ক্রম।
GREEN=$'\033[1;32m'
RED=$'\033[1;31m'
NONE=$'\033[m'
যদি আপনি এটি PS1করেন তবে একক উদ্ধৃতি সহ আপনার প্রথমটি কাজ করা উচিত:
PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '
তবে, তবে আপনার দ্বিতীয় সমস্যা হবে।
এটি চালানোর চেষ্টা করুন, তারপরে চাপুন Up Arrow, Homeএবং আপনার কার্সারটি লাইনের শুরুতে ফিরে যাবে না।
এটি ঠিক করার জন্য, রঙের পালানোর ক্রমগুলি PS1অন্তর্ভুক্ত করতে \[এবং পরিবর্তনের জন্য \]উদাহরণস্বরূপ
PS1='\[${RED}\]\h $(get_path) $?\[${NONE}\] '
আপনি get_exit_statusএখানে সঠিকভাবে ব্যবহার করতে পারবেন না , কারণ এর আউটপুটে মুদ্রণ (প্রস্থান কোড) এবং অপ-মুদ্রণ অক্ষর (রঙ কোডগুলি) উভয়ই রয়েছে এবং প্রম্পটে সঠিকভাবে চিহ্নিত করার কোনও উপায় নেই। পুটিং \[...\]এটিকে সম্পূর্ণ মুদ্রণবিহীন হিসাবে চিহ্নিত করবে, যা সঠিক নয়। আপনাকে ফাংশনটি পরিবর্তন করতে হবে যাতে এটি কেবল সঠিক রঙ-কোড মুদ্রণ করে এবং তারপরে \[...\]প্রম্পটে এটি ঘিরে ।
\[হয়\1, এবং\[হয়\2।RL_PROMPT_{START,END}_IGNOREস্ক্রিনে প্রম্পট দৈর্ঘ্য গণনা করার সময় এটি কিছু রিডলাইনের জিনিসের সাথে মিলে যায় যা এটি বাইটগুলি উপেক্ষা করতে বলে। List.gnu.org/archive/html/bug-bash/2015-08/msg00027.html দেখুন ।