বাশ প্রম্পটে কেবল বর্তমান এবং পিতামহিত ডিরেক্টরি দেখান


16

আমি মারতে নতুন এবং আমার প্রম্পটটি এমন কিছু দেখাতে চাই যা টিসিএস-এ তুচ্ছ ছিল, তবুও একটি ভাল গুগল অনুসন্ধানের পরেও আমি করতে পারি না।

আমি আমার প্রম্পটটিকে কেবলমাত্র বর্তমান এবং মূল পিতামহিত ডিরেক্টরিগুলি অন্তর্ভুক্ত করতে চাই:

/parent/currentdir $

Tcsh এ এটি অর্জন করে:

set prompt = "%C2 %"

তবে ব্যাশে আমি এখনও খুঁজে পেয়েছি যে একই আউটপুট পেতে আমাকে পিডাব্লুডিকে পার্স করতে হবে।

করার মতো সহজ উপায় নেই?

export PS1="$(some_command) $" 

2
তত্ত্বগতভাবে, PS1='\w \$'; PROMPT_DIRTRIM=2আপনাকে বাশ সমতুল্য দেওয়া উচিত, তবে এটি আমার সিস্টেমে সঠিকভাবে কাজ করে না।
মাইকেল

এটি আমার উপর মোটেও কাজ করে না: জিএনইউ ব্যাশ, সংস্করণ 3.2.57 (1) -রিলেজ (x86_64-আপেল-ডারউইন 14)।
টুয়ালবাউম

PROMPT_DIRTRIMবাশ 4 এ চালু হয়েছিল । আমি কেবল ডাব্লুএসএল এর অধীনে উবুন্টু 16.04 এ পরীক্ষা করেছি এবং এটি দুর্দান্ত কাজ করেছে!
মাইক ব্রান্সকি

উত্তর:


18

বাশের প্রম্পট নিয়ন্ত্রণ বৈশিষ্ট্যগুলি বরং স্থির। আপনি যদি আরও নিয়ন্ত্রণ চান তবে আপনি আপনার প্রম্পটে ভেরিয়েবলগুলি অন্তর্ভুক্ত করতে পারেন; আপনি promptvarsবিকল্পটি বন্ধ করেননি তা নিশ্চিত করুন ।

PS1='${PWD#"${PWD%/*/*}/"} \$ '

একক উদ্ধৃতি দ্রষ্টব্য: ভেরিয়েবলের বিস্তৃততা প্রম্পট প্রদর্শিত হওয়ার সময় ঘটতে হবে, PS1ভেরিয়েবল সংজ্ঞায়িত সময়ে নয় ।

আপনি যদি প্রদর্শিত হয় তার উপরে আরও নিয়ন্ত্রণ চান, আপনি কমান্ড বিকল্প ব্যবহার করতে পারেন। উদাহরণস্বরূপ, উপরের স্নিপেট ~হোম ডিরেক্টরিটির সংক্ষিপ্তসার হারিয়ে ফেলে ।

PS1='$(case $PWD in
        $HOME) HPWD="~";;
        $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        $HOME/*) HPWD="~/${PWD##*/}";;
        /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        *) HPWD="$PWD";;
      esac; printf %s "$HPWD") \$ '

এই কোডটি বরং জটিল, তাই এটি PS1ভেরিয়েবলের সাথে স্টিক করার পরিবর্তে , আপনি কোডটি সেট করতে চালানোর জন্য PROMPT_COMMANDভেরিয়েবলটি ব্যবহার করতে পারেন HPWDএবং তারপরে আপনার প্রম্পটে এটি ব্যবহার করতে পারেন।

PROMPT_COMMAND='case $PWD in
        $HOME) HPWD="~";;
        $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        $HOME/*) HPWD="~/${PWD##*/}";;
        /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        *) HPWD="$PWD";;
      esac'
PS1='$HPWD \$'

যেহেতু সংক্ষিপ্ত প্রম্পট কেবল একটি ডিরেক্টরি পরিবর্তনে পরিবর্তিত হয়েছে, তাই প্রতিবার প্রম্পট প্রদর্শিত হলে আপনাকে এটি পুনরায় গণনা করার দরকার নেই। বাশ কোনও হুক সরবরাহ করে না যা কোনও বর্তমান ডিরেক্টরি পরিবর্তনের সাথে চালিত হয়, তবে আপনি এটিকে ওভাররাইড cdএবং এর কাজিনদের দ্বারা অনুকরণ করতে পারেন ।

cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
  case $PWD in
    $HOME) HPWD="~";;
    $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
    $HOME/*) HPWD="~/${PWD##*/}";;
    /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
    *) HPWD="$PWD";;
  esac
}
PS1='$HPWD \$'

নোট করুন যে আপনার দরকার নেই এবং রফতানি করা উচিত নয় PS1, কারণ এটি শেল সেটিংস, পরিবেশ পরিবর্তনশীল নয়। একটি বাশ PS1সেটিং অন্য শেল দ্বারা বোঝা যাবে না।

পিএস আপনি যদি একটি সুন্দর ইন্টারেক্টিভ শেল অভিজ্ঞতা চান, তবে zsh এ স্যুইচ করুন , যেখানে এই সমস্ত (প্রম্পট %বিস্তৃতকরণগুলি মূলত tcsh এর অন্তর্ভুক্ত chpwd) ইত্যাদি স্থানীয় বৈশিষ্ট্য।

PS1='%2~ %# '

2
এটি গ্রহণযোগ্য এবং সর্বাধিক উত্সাহিত উত্তর হওয়া উচিত ছিল।
লার্শ

3

পিতামাতা এবং বর্তমান ডিরেক্টরিগুলি পাওয়ার সিনট্যাক্সটি মুনাইয়ের উত্তর থেকে নেওয়া হয়েছে ।

যাইহোক, গিলস দ্বারা উল্লিখিত হিসাবে, সেই কোডটি কেবলমাত্র বর্তমান ডিরেক্টরিটি বোঝানো হয়েছে তা দেখায় .bashrc, তবে আপনি সিস্টেমটি অন্য ফোল্ডারে নেভিগেট করার সাথে সাথে এটি পরিবর্তন হবে না।

আপনার .bashrcফাইলে এটি প্রম্পটটি স্বয়ংক্রিয়ভাবে আপনার বর্তমান ডিরেক্টরিতে আপডেট করে:

prompt_command () {
    PS1='$(basename $(dirname "$PWD"))/$(basename "$PWD") $ '
}
PROMPT_COMMAND=prompt_command

1
সংজ্ঞায়িত করা prompt_command()নিজস্ব কিছু করতে হবে? এটা আমার জন্য না। আপনার কি গিলসের মতো & কো এর prompt_command()পুনঃনির্ধারণগুলিতে ব্যবহার করার অর্থ cdছিল? না মানে PROMPT_COMMAND='...'?
লার্শ

2
এছাড়াও, $PWDএকটি কমান্ড থাকার পরে এই কমান্ডটি ব্যর্থ হয় ।
লার্শ

1
আমাকে এই ফিরিয়ে আনার জন্য আপনাকে ধন্যবাদ। স্থানগুলির জন্য অনুমতি দেওয়ার জন্য $ PWD গুলি উদ্ধৃত করে এবং চূড়ান্ত আদেশটি অন্তর্ভুক্ত করে। আমার বর্তমান প্রম্পট এটির চেয়ে জটিল, সুতরাং প্রম্পট_কম্যান্ড সংজ্ঞাটির প্রয়োজন। অন্যথায়, PS1 = ... এটিতে কাজ করে।
twalbaum

নেভিগেট করার সময় আউটপুট পরিষ্কার করার জন্য কোনও ধারণা /? লিখিত হিসাবে, আপনি পাবেন/// $
ezrock

0

bashশেল ভেরিয়েবল সম্পাদনা করে প্রম্পট স্ট্রিং সহজেই পরিবর্তন করা যায় PS1। এটি প্রম্পট স্ট্রিং 1 এর জন্য দাঁড়িয়েছে More আরও তথ্য এখানে

আপাতত আপনার bashশেলটি জ্বালিয়ে দিন ।

vi ~/.bashrc

ফাইলটিতে PS1 সংজ্ঞা যুক্ত করুন

`export PS1="$(basename $(dirname $PWD))/$(basename $PWD)"`

এটিকে আরও আরও টুইট করতে আপনাকে এখানে এবং এখানে আরও টিউটোরিয়াল ।


1
আমি বুঝতে পারি কীভাবে প্রম্পটটি সংশোধন করতে হয়। আমার প্রশ্নটি হ'ল কীভাবে কেবলমাত্র বর্তমান এবং পিতামত্তা ডিরেক্টরিগুলি পাবেন, পুরো পথটি নয়।
টুয়ালবাউম

@ তাতালবাউম আমার উত্তর সম্পাদনা করেছেন
দাশ

@ টালবাউমকে সাহায্য করতে পেরে আনন্দিত :)
দাস

1
এটি .bashrcলোড হওয়ার সাথে সাথে বর্তমান ডিরেক্টরিতে প্রম্পট সেট করে , আপনি cdঅন্য ডিরেক্টরিতে প্রম্পট পরিবর্তন করবেন না ! @ তাতালবাউম
গিলস 21

@ গিলস এটি আমার জন্য করে।
টুয়ালবাম

0

হোম ডিরেক্টরিতে "~" দিয়ে সহজ হতে পারে।

function PWDN {
  echo "${PWD/#$HOME/~}" | rev | cut -d "/" -f1 -f2 | rev
}

0
export PS1='[\u@\h $(basename $(dirname ${PWD}))/$(basename ${PWD})]\$ '
export PROMPT_COMMAND='echo -ne "\033]0;$(basename $(dirname $PWD))/$(basename ${PWD})\007"'

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