PS1 এবং PROMPT_COMMAND এর মধ্যে পার্থক্য কী


108

কটাক্ষপাত গ্রহণ করার সময় এই ভয়ঙ্কর থ্রেড আমি লক্ষ্য করেছি যে কিছু উদাহরণ ব্যবহার

PS1="Blah Blah Blah"

এবং কিছু ব্যবহার

PROMPT_COMMAND="Blah Blah Blah"

(এবং কিছু উভয় ব্যবহার করে) ব্যাশ শেলের মধ্যে প্রম্পট সেট করার সময়। এই দুটির মধ্যে পার্থক্য কী? একটি এসও অনুসন্ধান এবং এমনকি বিস্তৃত গুগল অনুসন্ধানগুলিও আমার ফলাফল পাচ্ছে না, সুতরাং উত্তরটি সন্ধানের জন্য সঠিক জায়গায় একটি লিঙ্কও প্রশংসা করবে।

উত্তর:


59

জিএনইউ বাশ ডক পৃষ্ঠা থেকে: http://www.gnu.org/software/bash/manual/bashref.html

PROMPT_COMMAND
    If set, the value is interpreted as a command to execute before
    the printing of each primary prompt ($PS1).

আমি কখনই এটি ব্যবহার করিনি, তবে আমি কেবল এইচএস করলেই আমি এই পিছনে ব্যবহার করতে পারতাম।


67

PROMPT_COMMAND এ সাধারণ ব্যাশ স্টেটমেন্ট থাকতে পারে যেখানে PS1 ভেরিয়েবলটিতে ভেরিয়েবলের হোস্ট নেম জন্য '\ h' এর মতো বিশেষ অক্ষরও থাকতে পারে।

উদাহরণস্বরূপ এখানে আমার বাশ প্রম্পট যা উভয়ই PROMPT_COMMAND এবং PS1 ব্যবহার করে। PROMPT_COMMAND এ থাকা বাশ কোডটি আপনি কী গিট শাখায় থাকতে পারেন তা প্রকাশ করে এবং প্রম্পটে প্রদর্শিত হয়, শেষ রানের প্রক্রিয়াটির প্রস্থান স্থিতি, পিডাব্লুডির হোস্টনাম এবং বেসনামের সাথে। পরিবর্তনশীল আরইটি শেষ সম্পাদিত প্রোগ্রামের রিটার্ন মান সঞ্চয় করে। টার্মিনালে আমি যে গত প্রোগ্রামটি চালিয়েছিলাম তাতে কোনও ত্রুটি এবং ত্রুটি কোড ছিল কিনা তা দেখতে সুবিধাজনক। সম্পূর্ণ PROMPT_COMMAND এক্সপ্রেশনটির চারপাশে বাইরেরটি নোট করুন। এটি পিএস 1 অন্তর্ভুক্ত করে যাতে এই পরিবর্তনকটি প্রতিবার PROMPT_COMMAND ভেরিয়েবলটি মূল্যায়ন করা হয়।

PROMPT_COMMAND='RET=$?;\
  BRANCH="";\
  ERRMSG="";\
  if [[ $RET != 0 ]]; then\
    ERRMSG=" $RET";\
  fi;\
  if git branch &>/dev/null; then\
    BRANCH=$(git branch 2>/dev/null | grep \* |  cut -d " " -f 2);\
  fi;
PS1="$GREEN\u@\h $BLUE\W $CYAN$BRANCH$RED$ERRMSG \$ $LIGHT_GRAY";'

উদাহরণ আউটপুটটি নন-গিট ডিরেক্টরিতে এটির মতো দেখাচ্ছে:

sashan@dhcp-au-122 Documents  $ false
sashan@dhcp-au-122 Documents  1 $ 

এবং গিট ডিরেক্টরিতে আপনি শাখার নাম দেখতে পাবেন:

sashan@dhcp-au-122 rework mybranch $ 

হালনাগাদ

মন্তব্য এবং বব এর উত্তর পড়ার পরে আমি মনে করি যে তিনি বর্ণনা হিসাবে এটি লেখার চেয়ে ভাল। আমি প্রথমে যা লিখেছি তার চেয়ে এটি আরও রক্ষণাবেক্ষণযোগ্য, যেখানে PS1 ভেরিয়েবলটি PROMPT_COMMAND এর মধ্যে সেট করা আছে, যা নিজেই একটি সুপার জটিল স্ট্রিং যা বাশ দ্বারা রানটাইম সময়ে মূল্যায়ন করা হয়। এটি কাজ করে, তবে এটি হওয়া দরকারের চেয়ে জটিল। ন্যায়সঙ্গত হওয়ার জন্য আমি লিখেছিলাম যে PROMPT_COMMAND আমার জন্য প্রায় 10 বছর আগে এবং এটি কাজ করেছে এবং এটি সম্পর্কে খুব বেশি ভাবেনি।

আমি কীভাবে আমার জিনিসগুলি সংশোধন করেছি সে সম্পর্কে কৌতুহলকারীদের জন্য, আমি মূলত PROMPT_COMMAND এর জন্য পৃথক ফাইলে কোড রেখেছি (বব বর্ণিত হিসাবে) এবং তারপরে আমি PS1 হওয়ার ইচ্ছার স্ট্রিংটি প্রতিধ্বনিত করেছি:

GREEN="\[\033[0;32m\]"
CYAN="\[\033[0;36m\]"
RED="\[\033[0;31m\]"
PURPLE="\[\033[0;35m\]"
BROWN="\[\033[0;33m\]"
LIGHT_GRAY="\[\033[0;37m\]"
LIGHT_BLUE="\[\033[1;34m\]"
LIGHT_GREEN="\[\033[1;32m\]"
LIGHT_CYAN="\[\033[1;36m\]"
LIGHT_RED="\[\033[1;31m\]"
LIGHT_PURPLE="\[\033[1;35m\]"
YELLOW="\[\033[1;33m\]"
WHITE="\[\033[1;37m\]"
RESTORE="\[\033[0m\]" #0m restores to the terminal's default colour

if [ -z $SCHROOT_CHROOT_NAME ]; then
    SCHROOT_CHROOT_NAME=" "
fi
BRANCH=""
ERRMSG=""
RET=$1
if [[ $RET != 0 ]]; then
    ERRMSG=" $RET"
fi
if which git &>/dev/null; then
    BRANCH=$(git branch 2>/dev/null | grep \* |  cut -d " " -f 2)
else
    BRANCH="(git not installed)"
fi
echo "${GREEN}\u@\h${SCHROOT_CHROOT_NAME}${BLUE}\w \
${CYAN}${BRANCH}${RED}${ERRMSG} \$ $RESTORE"

এবং আমার .bashrc এ

function prompt_command {
    RET=$?
    export PS1=$(~/.bash_prompt_command $RET)
}
PROMPT_DIRTRIM=3
export PROMPT_COMMAND=prompt_command

1
তুমি তোমার লাইনের এক কমান পারে: if git branch &>/dev/null ; then\ । এটি স্টডআউট এবং স্ট্ডার উভয়ই / dev / নালকে পুনঃনির্দেশ করে। tldp.org/LDP/abs/html/io-redirection.html

3
রফতানি করার দরকার নেই PROMPT_COMMAND
ডলমেন

2
আমি মনে করি এই উত্তরের জন্যও সিভিংয়ের মন্তব্যটি খুব সত্য:Don't set PS1 in PROMPT_COMMAND! Set variables in PROMPT_COMMAND and use them in PS1
ফিল 294

2
আমি কোনও কারণ দেখছি না, কেন PS1অনলাইনে পরিবর্তন PROMPT_COMMANDকরা অসুবিধে। এটি নিখুঁত দরকারী কোড। বব এর উত্তর নীচে বিপরীতে, PS1পরিবর্তনশীল সঠিকভাবে নির্মিত হয়েছিল। এটি আপনার আসল পরিস্থিতির উপর নির্ভর করে আরও অনেক পরিশীলিত বাশ প্রম্পটকে মঞ্জুরি দেয়।
খ্রিস্টান ওল্ফ

2
@ ক্রিশ্চিয়ান ওল্ফ এর PS1অভ্যন্তরের নির্মাণের PROMPT_COMMANDকোনও উদ্দেশ্য নেই। এটি কীভাবে করবেন না এটি একটি উদাহরণ। PS1একবারে নির্মাণ করুন .bash_profile, কেবল ডাবল উদ্ধৃতিগুলির পরিবর্তে একক উদ্ধৃতি ব্যবহার করুন, যাতে প্রতিটি প্রম্পটের সময় পরিবর্তনীয় বিকল্পগুলি মূল্যায়ন করা হয়।
পাল

46

পার্থক্যটি হ'ল পিএস 1 হ'ল প্রকৃত প্রম্পট স্ট্রিংটি ব্যবহার করা হয় এবং PROMPT_COMMAND একটি কমান্ড যা প্রম্পটের ঠিক আগে সম্পাদিত হয়। যদি আপনি কোনও প্রম্পট তৈরির সহজতম এবং সর্বাধিক নমনীয় উপায় চান তবে এটি চেষ্টা করুন:

এটি আপনার .bashrc এ রাখুন:

function prompt_command {
  export PS1=$(~/bin/bash_prompt)
}
export PROMPT_COMMAND=prompt_command

তারপরে একটি স্ক্রিপ্ট লিখুন (বাশ, পার্ল, রুবি: আপনার পছন্দ) এবং এটিকে bin / বিন / বাশ_প্রম্পটে রাখুন।

স্ক্রিপ্ট কোনও প্রম্পট তৈরি করতে পছন্দ করে এমন কোনও তথ্য ব্যবহার করতে পারে। এটি অনেক সহজ আইএমও কারণ আপনাকে কেবল পিএস 1 ভেরিয়েবলের জন্য তৈরি করা কিছুটা বারোকের বিকল্প ভাষা শিখতে হবে না।

আপনি ভাবতে পারেন যে আপনি কেবল MP / bin / bash_prompt এ সরাসরি PROMPT_COMMAND সেট করে এবং PS1 টি খালি স্ট্রিংয়ে সেট করে আপনি একই কাজ করতে পারেন। এটি প্রথমে কাজ করে বলে মনে হচ্ছে তবে আপনি শীঘ্রই আবিষ্কার করবেন যে রিডলাইন কোডটি PS1টিকে আসল প্রম্পটে সেট করা আশা করে এবং আপনি যখন ইতিহাসে ব্যাকওয়ার্ডগুলি স্ক্রোল করেন, ফলস্বরূপ জিনিসগুলি গণ্ডগোল হয়ে যায়। এই কার্যকারিতা পিএস 1 এর সর্বদা সর্বশেষ প্রম্পট প্রতিফলিত করে (যেহেতু ফাংশনটি শেলের অনুরোধমূলক উদাহরণ দ্বারা ব্যবহৃত আসল PS1 সেট করে) এবং এটি পঠন এবং কমান্ড ইতিহাসকে কাজ করে তোলে।


17
সেট PS1না PROMPT_COMMAND! এর মধ্যে ভেরিয়েবল সেট করুন PROMPT_COMMANDএবং এগুলিতে ব্যবহার করুন PS1। অন্যথায় আপনি বা এর PS1মতো পালানোর সিকোয়েন্সগুলি ব্যবহার করার ক্ষমতাটি হ্রাস করবেন । আপনাকে সেগুলিকে পুনর্বিবেচনা করতে হবে । যে সম্ভব হতে পারে কিন্তু এটি হারান প্রায় কাজ করা সম্ভব নয় এবং যা চিহ্নিত শুরুতে এবং অ মুদ্রণযোগ্য অক্ষর শেষে। এর অর্থ আপনি প্রম্পটের দৈর্ঘ্য সম্পর্কে টার্মিনালটিকে বিভ্রান্ত না করে রং ব্যবহার করতে পারবেন না। এবং এই দুটি বিভক্ত স্পষ্ট একটি কমান্ড সম্পাদনা করার সময় বিভ্রান্ত হয় । শেষ পর্যন্ত আপনি পর্দায় একটি বড় জগাখিচুড়ি আছে। \u\hPROMPT_COMMAND\[\]readline

1
এই সত্যটি! কেউ আপনার PS1 এর ফর্ম্যাটটি পরিবর্তন করতে এবং উভয় বিশ্বের সেরা পেতে PROMPT_COMMAND ব্যবহার করতে পারে
গ্রেট

3
PROMPT_COMMANDমুদ্রণের আগে কার্যকর করা হয় PS1। আমি PS1ভিতরে থেকে কোনও সমস্যা স্থাপন করতে দেখছি না PROMPT_COMMAND, কারণ PROMPT_COMMANDশেষ হওয়ার পরে , শেলটি মুদ্রণ করবে PS1, যা PROMPT_COMMAND(বা এই ক্ষেত্রে, ভিতরে prompt_command) থেকে সংশোধিত হয়েছিল ?
ফিলিপ আলভারেজ

3
সতর্কতা: PROMPT_COMMAND সাধারণত প্রম্পটে সরাসরি অক্ষর মুদ্রণ করতে ব্যবহার করা উচিত নয়। পিএস 1 এর বাইরে মুদ্রিত অক্ষর বাশ দ্বারা গণনা করা হয় না, এটি কার্সার এবং পরিষ্কার অক্ষরগুলি ভুলভাবে স্থাপন করবে। হয় PS1 সেট করতে PROMPT_COMMAND ব্যবহার করুন বা এম্বেডিং কমান্ডগুলি দেখুন। ( আর্চ উইকি উত্স )
meffect

3
আমি পিএস 1 তে কমান্ড সাবস্টিটিউশনটি ব্যবহার না করে প্রম্পট-কম-এমএমএন্ডে কেন কিছু কৌশল করার চেষ্টা করি তা আমি বুঝতে পারছি না export PS1='$(~/bin/bash_prompt)'বাগটি বুদ্ধিমান দেখাচ্ছে
পাল

10

থেকে man bash:

PROMPT_COMMAND

যদি সেট করা থাকে, প্রতিটি প্রাথমিক প্রম্পট দেওয়ার আগে মানটি একটি আদেশ হিসাবে কার্যকর করা হয়।

PS1

এই প্যারামিটারটির মান প্রসারিত হয়েছে (নীচে PROMPTING দেখুন) এবং প্রাথমিক প্রম্পট স্ট্রিং হিসাবে ব্যবহৃত হয়। ডিফল্ট মান '' \ s- \ v \ $ ''।

আপনি যদি কেবল প্রম্পট স্ট্রিং সেট করতে চান তবে PS1একা ব্যবহার করা যথেষ্ট:

PS1='user \u on host \h$ '

প্রম্পটটি প্রিন্ট করার ঠিক আগে যদি আপনি অন্য কিছু করতে চান তবে ব্যবহার করুন PROMPT_COMMAND। উদাহরণস্বরূপ, আপনি যদি ক্যাশেড ডিস্কগুলিতে সিঙ্ক করতে চান তবে আপনি লিখতে পারেন:

PROMPT_COMMAND='sync'

1
এছাড়াও আপনি থেকে টার্মিনাল শিরোনাম সেট করতে পারেন PS1ছাড়াই PROMPT_COMMANDযেমন ক্রম যে শিরোনাম সেট অন্তর্ভুক্ত করা যেতে পারে, PS1সঙ্গে আবৃত \[এবং \]
ডলম্যান

1
@ ডলম্যান ঠিক আছে। তারপরে চলুন অন্য কিছু করা যাক যেমন পরিবেশের পরিবর্তনশীলকে গতিশীলভাবে সেট করা।
সাইকেল

@ সাইকার আপনি গতিশীলভাবে পরিবেশের পরিবর্তনশীলগুলিতে সেট করতে পারেন PS1, এটি কেবল সাবশেলে সেট করা হবে, যাতে আপনি এর মান ফিরে পেতে পারবেন না। তবে আপনার উদাহরণটি তুচ্ছPS1='$(sync)user \u on host \h$ '
পাল

1

পার্থক্য যে

  • আপনি যদি অসম্পূর্ণ লাইনটি আউটপুট করেন তবে PROMPT_COMMANDএটি আপনার ব্যাশ প্রম্পটটিকে স্ক্রু করবে
  • PS1বিকল্প \Hএবং বন্ধুরা
  • PROMPT_COMMANDএর সামগ্রীগুলি চালায়, PS1প্রম্পট হিসাবে এর সামগ্রীগুলি ব্যবহার করে।

PS1প্রতিটি প্রম্পটে ভেরিয়েবল প্রসারণ এবং কমান্ড প্রতিস্থাপন করে, স্বেচ্ছাসেবক কোডের PROMPT_COMMANDমান নির্ধারণ PS1বা চালানোর জন্য ব্যবহার করার দরকার নেই । আপনি export PS1='$(uuidgen) $RANDOM'একবারে সহজেই করতে পারেন .bash_profile, কেবল একক উদ্ধৃতি ব্যবহার করুন


0

হ্যাঁ, তাই এটিকে সত্যিই পেরেক দেওয়ার চেষ্টা করুন:

  • PROMPT_COMMANDএকটি সহজ ব্যাশ সুবিধা ভেরিয়েবল / ফাংশন, কিন্তু আছে, কঠোরভাবে বলা, এমন কিছু যা PS1একা ব্যবহার করেও করা যায় না, সঠিক?

আমি বলতে চাইছি, যদি কেউ প্রম্পটের বাইরে স্কোপ সহ আরেকটি পরিবর্তনশীল সেট করতে চায় : শেলের উপর নির্ভর করে সম্ভবত এই পরিবর্তনশীলটিকে প্রথমে বাইরে ঘোষণার প্রয়োজন হতে পারে বা (সবচেয়ে খারাপ পরিস্থিতি) কারও আগে ফিফোর অপেক্ষায় কিছুটা অভিনব হওয়া দরকার might কলিং (এবং শেষে আবার সশস্ত্র ); কিছু সমস্যা সৃষ্টি আপনি কিছু অভিনব Regex ব্যবহার করছেন বিশেষ করে পারে; তবে অন্যথায়: কমান্ড প্রতিস্থাপনের মধ্যে (এবং, সম্ভবত কোণার ক্ষেত্রে, সুস্পষ্ট সাবসেল) ব্যবহার করে যে কেউ কিছু করতে পারে ?$PS1$PS1$PS1\u \hPROMPT_COMMAND$PS1

রাইট?

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