লাইনের দৈর্ঘ্যের গণনা না ভেঙে বাশের পিএস 1-এ কমান্ডগুলি কীভাবে অন্তর্ভুক্ত করবেন?


13

টোনিন আমার ডিফল্ট প্রম্পটে একটি বাগ নির্দেশ করেছে । সর্বনিম্ন উদাহরণ:

  1. PS1 সেট করুন:

    PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " ")$ '

    এই মুহুর্তে, প্রম্পটটি এর মতো দেখাচ্ছে:

    $ 
  2. এখন চালিয়ে প্রস্থান কোড আউটপুট ট্রিগার করুন:

    false

    এখন প্রম্পটে রেখার প্রারম্ভের সময় লাল রঙের প্রস্থান কোড রয়েছে:

    1 $ 
  3. টিপুন Ctrl- r
  4. "মিথ্যা" টাইপ করুন। এখন প্রম্পটে কেবল অনুসন্ধান রয়েছে:

    (reverse-i-search)`false': false
  5. টিপুন Enter

ফলস্বরূপ টার্মিনাল ইতিহাসে নিম্নলিখিতটি রয়েছে:

1 $ch)`false': false

প্রত্যাশিত আউটপুট:

1 $ false

এটি হ'ল ইতিহাস সন্ধান আউটপুটটি প্রম্পটের সাথে মিশে গেছে এবং প্রকৃত কমান্ডটি লুকিয়ে রয়েছে যা চালিত হয়েছিল।

আমি এটি ব্যবহার করেPROMPT_COMMAND এটিকে ঘিরে কাজ করার চেষ্টা করেছি :

set_exit_code() {
    exit_code=$?
    [[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " "
}
set_bash_prompt() {
    PS1='$(set_exit_code)$ ' # Double quotes give the same result
}
PROMPT_COMMAND=set_bash_prompt

এটি কাজ করছে বলে মনে হচ্ছে না - অনুসন্ধান এবং চালানোর পরে লাইনটি ঠিক আগের মতো দেখায়।

আমি এটা কিভাবে ঠিক করবো?


উত্তর:


8

আমি জিজ্ঞাসাবাদ ডট কম এ উত্তরটি পেয়েছি । @ কিরহা উল্লেখ করেছেন যে আপনাকে বাশকে বলতে হবে যে অক্ষরের অনুক্রমটি প্রম্পটের দৈর্ঘ্যে গণনা করা উচিত নয় এবং আপনি এটিটি ঘিরে রেখে তা করেন \[ \]। প্রদত্ত উদাহরণের ভিত্তিতে, এখানে একটি সমাধান রয়েছে:

red=$(tput setaf 1)

reset=$(tput sgr0)

[ "$PS1" = "\\s-\\v\\\$ " ] && PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s \[$red\] $exit_code \[$reset\] " ")$ '

এর জন্য জিজ্ঞাসা উবুন্টুতে যাওয়ার দরকার নেই । আমাদের এখানে ইতিমধ্যে এই প্রশ্নের যথেষ্ট উত্তর রয়েছে।
manatwork

@Manatwork পরামর্শের জন্য আপনাকে ধন্যবাদ! আমি ব্যাখ্যাটির জন্য যথাযথ ক্রেডিট দিতে চেয়েছিলাম এবং সৌজন্য হিসাবে রেফারেন্স সরবরাহ করেছি।
টিমোথি মার্টিন

Creditণ দেওয়া কোনও সমস্যা নয়। তবে সমস্যার কথা বলার সময়: অনাকাঙ্কিত ব্যাকস্ল্যাশগুলি মার্কডাউন থেকে অদৃশ্য হয়ে যেত, সুতরাং আপনার প্লেইন \ [আপনার পোস্টে পরিণত হয়েছে, সুতরাং প্রদর্শিত কোডটি টার্মিনালে অনুলিপি-পেস্ট করে কার্যকর হয়নি। ইনলাইন কোড বা কোড ব্লক মার্কআপ ব্যবহার করে এড়ানো যায়। ( আমি কীভাবে
মার্কডাউন

1
ডি আহা! আমি অন্য PS1কোডের জন্য ইতিমধ্যে একই সমস্যাটি স্থির করেছি , কেন আমি এটিটি দেখিনি?
l0b0

1
PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s \[$(tput setaf 1)\] $exit_code \[$(tput sgr0)\] " ")$ '

(দুঃখিত, এখানে কোনও ব্যাখ্যা নেই See দেখুন PS1 কীভাবে সঠিকভাবে কাস্টমাইজ করা যায়? বা প্রম্পট দৈর্ঘ্যের গণনা সম্পর্কিত সমস্যাগুলি এবং অন্য কোনও প্রশ্ন \[... \])


দ্বিতীয় @ l0b0 প্রশ্নে, আমি যুক্ত করব যে PS1 ব্যবহার করে \[...\]যতক্ষণ না আপনি আপনার প্রম্পটটি যে একক স্ট্রিংটিতে উত্পন্ন করতে চান তার সব কোড রাখতে পারবেন ততক্ষণ ঠিক কাজ করে । তবে, আপনি যদি নিজের কোডটিকে ছোট ফাংশনে বিভক্ত করতে চান, আপনি এমন একটি পয়েন্টে এসে পৌঁছেছেন যেখানে আপনি একই স্ট্রিং / ফাংশনে আরম্ভ এবং শেষ বন্ধনীগুলি রাখতে পারবেন না। এবং যে লাইন মোড়ানো ব্রেক। যতক্ষণ না আপনি প্রতিটি প্রম্পটে PROMPT_COMMANDআপনার পুনরুদ্ধার করতে ব্যবহার অবলম্বন PS1করেন।
টোনিন

1

@ মানটওয়ার্ক উত্তরটি প্রসারিত করা কিন্তু আপনার কোডকে PS1আলাদা আলাদা ফাংশনে বিভাজন রেখে আপনি নিম্নলিখিত প্রম্পটটি লিখতে পারেন:

set_exit_code() {
    exit_code=$?
    [[ $exit_code -eq 0 ]] || printf "\[$(tput setaf 1)\] $exit_code \[$(tput sgr0)\] "
}
set_bash_prompt() {
    PS1="$(set_exit_code)$ " # with double quotes!
}
PROMPT_COMMAND=set_bash_prompt

ফাংশনটি সেট করার সময় PS1এবং ব্যবহারের সময় উভয়ই ডাবল উদ্ধৃতি বাধ্যতামূলক printf


ভবিষ্যতের রেফারেন্সের জন্য, আপনার মধ্যে একটি বাশ ফাংশন ব্যবহার করুন .bashrc- আলাদা কোনও ফাইলে কোড রাখবেন না এবং এটিকে কল করুন।
তারকাবিআমরনোলাবস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.