ডিরেক্টরি গাছ / ফাইলের নাম ব্যবহার করার সময় কমপ্যাক্ট বাশ প্রম্পট


16

উবুন্টু 14.04 সহ একটি সিস্টেমে এবং bashআমার PS1নীচের বিষয়বস্তুগুলির সাথে ভেরিয়েবল শেষ হবে:

\u@\h:\w\$

যাতে প্রম্পট হিসাবে প্রদর্শিত হবে

user@machinename:/home/mydirectory$

কখনও কখনও, তবে, বর্তমান ডিরেক্টরিটির একটি দীর্ঘ নাম রয়েছে, বা এটি দীর্ঘ নাম সহ ডিরেক্টরিগুলির ভিতরে রয়েছে, যাতে প্রম্প্টটির মতো দেখতে

user@machinename:/home/mydirectory1/second_directory_with_a_too_long_name/my_actual_directory_with_another_long_name$

এটি টার্মিনালে লাইনটি পূরণ করবে এবং কার্সারটি অন্য লাইনে যাবে, যা বিরক্তিকর।

পরিবর্তে আমি কিছু পেতে চাই

user@machinename:/home/mydirectory1/...another_long_name$

ডিরেক্টরিটি PS1"র‌্যাপ" এবং "কমপ্যাক্ট" ডিরেক্টরিটির সংজ্ঞা দেওয়ার কোনও উপায় আছে , সংক্ষিপ্ত প্রম্পটটি প্রাপ্ত না করে কোনও নির্দিষ্ট অক্ষরকে অতিক্রম করতে না পারে?


1
ভাগ্যক্রমে আমার মনে আছে শেল প্রম্পটটি কীভাবে কাস্টমাইজ করতে হবে তা আমি কোথায় পড়েছি: tldp.org/HOWTO/Bash-Prompt-HOWTO/x783.html বাশ প্রম্পট হাওটো রচয়িতা গাইলস অর এবং এতে অবদানকারী লোকদের ধন্যবাদ!
স্টেমড

এছাড়াও unix.stackexchange.com/a/216871/117549 ( ksh- ভিত্তিক, কিন্তু একই ধারণা) দেখুন
জেফ শ্যাচলার

উত্তর:


16

প্রথম সব, আপনি কেবল পরিবর্তন করতে চাইতে পারেন \wসঙ্গে \W। এইভাবে, কেবলমাত্র বর্তমান ডিরেক্টরিটির নাম মুদ্রিত এবং পুরো পথটি নয়:

terdon@oregano:/home/mydirectory1/second_directory_with_a_too_long_name/my_actual_directory_with_another_long_name $ PS1="\u@\h:\W \$ "
terdon@oregano:my_actual_directory_with_another_long_name $ 

ডিরেক্টরিটির নামটি যদি খুব দীর্ঘ হয় তবে এটি এখনও যথেষ্ট হবে না। সেক্ষেত্রে আপনি এর PROMPT_COMMANDজন্য ভেরিয়েবলটি ব্যবহার করতে পারেন । এটি একটি বিশেষ বাশ ভেরিয়েবল যার মূল্য প্রতিটি প্রম্পট দেখানোর আগে কমান্ড হিসাবে কার্যকর করা হয়। সুতরাং, যদি আপনি এমন কোনও ফাংশনে সেট করেন যা আপনার বর্তমান ডিরেক্টরিটির পথের দৈর্ঘ্যের উপর ভিত্তি করে আপনার পছন্দসই প্রম্পটটি সেট করে, আপনি তার পরে কার্যকর হতে পারেন। উদাহরণস্বরূপ, আপনার এই লাইনগুলি যুক্ত করুন ~/.bashrc:

get_PS1(){
        limit=${1:-20}
        if [[ "${#PWD}" -gt "$limit" ]]; then
                ## Take the first 5 characters of the path
                left="${PWD:0:5}"
                ## ${#PWD} is the length of $PWD. Get the last $limit
                ##  characters of $PWD.
                right="${PWD:$((${#PWD}-$limit)):${#PWD}}"
                PS1="\[\033[01;33m\]\u@\h\[\033[01;34m\] ${left}...${right} \$\[\033[00m\] "
        else
                PS1="\[\033[01;33m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] "
        fi


}
PROMPT_COMMAND=get_PS1

প্রভাবটি এর মতো দেখাচ্ছে:

terdon@oregano ~ $ cd /home/mydirectory1/second_directory_with_a_too_long_name/my_actual_directory_with_another_long_name
terdon@oregano /home...th_another_long_name $ 

10

একটি চরিত্রের রিটার্নে যুক্ত করা এটির মূল সমাধান

সুতরাং আমার প্রম্পটটি (এতে অন্যান্য জিনিসও রয়েছে, এটি আরও দীর্ঘ করে তোলে) দেখতে দেখতে এটি দেখতে:

এখানে চিত্র বর্ণনা লিখুন

আপনি লক্ষ্য করবেন যে $ নতুন লাইন হিসাবে ফিরে আসবে

আমি এটি দিয়ে অর্জন

HOST='\[\033[02;36m\]\h'; HOST=' '$HOST
TIME='\[\033[01;31m\]\t \[\033[01;32m\]'
LOCATION=' \[\033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
PS1=$TIME$USER$HOST$LOCATION'\n\$ '

মনে রাখবেন যে পৃথক লাইনে থাকা সত্ত্বেও, সুপার দীর্ঘ ডিরেক্টরি গাছ যেমন

/home/durrantm/Dropbox/96_2013_archive/work/code/ruby__rails সংক্ষিপ্ত করা হয়

/home/durrantm/Dropbox/_/code/ruby__rails

যেমন "শীর্ষ 3 ডিরেক্টরি / _ / নীচে দুটি ডিরেক্টরি" যা সাধারণত আমি যত্ন করি care

এটি নিশ্চিত করবে যে ডিরেক্টরি গাছের দৈর্ঘ্যের কারণে লাইনটি কখনই খুব বেশি দীর্ঘ হয় না। আপনি যদি সর্বদা সম্পূর্ণ ডিরেক্টরি গাছ চান তবে কেবলমাত্র LOCATION সামঞ্জস্য করুন

LOCATION=' \[\033[01;34m\]`pwd`'


1
আপনার প্রম্পটে আসলে কোথায় অন্তর্ভুক্ত রয়েছে $ ? (দেখুন এই ।)
জি-ম্যান বলেছেন 'পুনর্বহাল মনিকা'

ধন্যবাদ শেষে \। যুক্ত হয়েছে। এটি কারণ সাধারণত আমি আমার গিট শাখা দেখায় তবে এটি এখানে খুব বেশি বিবরণ
মাইকেল ডুরান্ট

1
কি? কোন নিউলাইন নেই? এসজিআর0 নেই?
জি-ম্যান

লাইনফিডটি যুক্ত করা হয়েছে
মাইকেল ডুরান্ট

3

তৈরি ~ / .বাশ_প্রম্পট:

maxlen=36
# set leftlen to zero for printing just the right part of the path
leftlen=19
shortened="..."
# Default PWD
nPWD=${PWD}
if [ ${#nPWD} -gt $maxlen ]; then
  offset=$(( ${#nPWD} - $maxlen + $leftlen ))
  nPWD="${nPWD:0:$leftlen}${shortened}${nPWD:$offset:$maxlen}"
else
  nPWD='\w'
fi
echo "\u@\h:$nPWD\$ "

আমার ~ / .বাশ_ প্রোফাইলে যুক্ত হয়েছে:

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

আউটপুট হল:

user@machinename:/home/mydirectory1/...another_long_name$

1

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

murphy@seasonsend:~
$ echo $PS1
\u@\h:\w\n\$
murphy@seasonsend:~
$ 

1

আমি এটি ব্যবহার করি, এটি একাধিক লাইন এবং ইনডেন্টগুলির দৈর্ঘ্যের সাথে আবৃত করে user@hostযাতে এটি বর্তমানকে PS1কার্যকরভাবে কার্যকর বলে ধরে নেয় ' \u@\h:\w$' এটি পাথটি ছাঁটাই করে না এবং এটি বর্তমান টার্মিনাল প্রস্থের সাথে খাপ খায়। এটি কেবলমাত্র পথটি বিভক্ত করে /, তাই এটি দীর্ঘতর ডিরেক্টরিগুলির সাথে মার্জিতভাবে ডিল করে না (তবে এটি নির্বাচন / অনুলিপিটির জন্য স্থানগুলি সংরক্ষণ করে)। এটি নিশ্চিত করে যে আপনার কাছে সর্বদা ইনপুট জন্য কমপক্ষে 20 টি অক্ষরের স্থান উপলব্ধ রয়েছে।

readonly _PS1="${PS1}" 2>/dev/null

function myprompt()
{
    local IFS
    local nn nb pbits xpwd="" ww=60 len=0 pp='\\w\$ '
    local indent uh="${LOGNAME}@${HOSTNAME//.*/}"

    test -n "$COLUMNS" && let ww=$COLUMNS-20  # may be unset at startup

    PS1="${_PS1}"
    if [ ${#PWD} -ge $ww ]; then
        printf -v indent "%${#uh}s%s" " " "> "  # indent strlen(user@host)

        IFS=/ pbits=( $PWD ); unset IFS
        nb=${#pbits[*]}
        for ((nn=1; nn<nb; nn++)) {
            if [ $(( $len + 1 + ${#pbits[$nn]} )) -gt $ww ]; then
                xpwd="${xpwd}/...\n${indent}..."
                len=0
            fi
            xpwd="${xpwd}/${pbits[$nn]}"
            let len=len+1+${#pbits[$nn]}
        }
        # add another newline+indent if the input space is too tight
        if (( ( ${#uh} + len ) > ww )); then
            printf -v xpwd "${xpwd}\n%${#uh}s" " " 
        fi 
        PS1="${PS1/$pp/$xpwd}$ "    
    fi
}
PROMPT_COMMAND=myprompt

এটি ম্যাজিকটি বাইরে নিয়ে \w(কেবল এটির \w$জন্য মেলে ) এর সাথে PS1এবং এর পরিবর্তে কাজ করে $PWD, তারপরে এটিকে অক্ষরের স্বচ্ছ স্ট্রিং হিসাবে মোড়ক করে। এটি PS1সংরক্ষিত আসল মান থেকে প্রতিবার সংশোধন করে _PS1, এর অর্থ "অদৃশ্য" পলায়নগুলিও সংরক্ষিত থাকে, এর জন্য আমার সম্পূর্ণ আসল প্রম্পট স্ট্রিং xtermএবং সাহসী প্রম্পট:

PS1="\[\033]0;\u@\h:\w\007\]\[$(tput bold)\]\u@\h\[$(tput sgr0)\]:\w$ "

এবং শেষের ফলটি একটি 80 কলামের টার্মিনালটিতে:

mr@onomatopoeia:~$ cd /usr/src/linux/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace
mr@onomatopoeia:/usr/src/linux/tools/perf/scripts/perl/Perf-Trace-Util/lib/...
               > .../Perf/Trace$ _

এটি ব্যাশ -৩.২ থেকে printf -v varব্যবহৃত হিসাবে ব্যবহৃত হয়। বিভিন্ন জটিলতার কারণে এর অন্যান্য বিভিন্নতার জন্য এটি কিছু সামঞ্জস্যের প্রয়োজন হবেPS1

( এক্সটার্ম শিরোনাম বারের পথটি মোড়ানো বা সংক্ষেপিত নয়, যা উপরের ফাংশনে অন্য উত্তরগুলির মধ্যে একটি অন্তর্ভুক্ত করে এটি করা যেতে পারে))


0

বিকল্প হিসাবে, আমার .zshrc এ আমি পিক্সেল প্রস্থ একটি নির্দিষ্ট প্রস্থের বেশি হলে প্রতিটি ডিরেক্টরিটির প্রথম অক্ষরকে সংক্ষেপ করে:

user@machinename:/home/mydirectory1/second_directory
user@machinename:/home/mydirectory1/second_directory/my_actual_directory

হয়ে:

user@machinename:/h/mydirectory1/second_directory
user@machinename:/h/m/s/my_actual_directory

এটি করার জন্য এখানে zsh ফাংশনটি রয়েছে:

     # get the path
     t=`print -P "%m:%~"`;
     t=`echo $t | sed -r 's/([^:])[^:]*([0-9][0-9]):|([^:])[^:]*([^:]):/\1\2\3\4:/'`;
     oldlen=-1;

     # create 4 buckets of letters by their widths
     t1="${t//[^ijlIFT]}";
     t2="${t//[ijlIFTGoQMmWABEKPSVXYCDHNRUw]}";
     t3="${t//[^ABEKPSVXYCDHNRUw]}";
     t4="${t//[^GoQMmW]}";

     # keep abbreviating parent directories in the path until under 456 pixels
     while (( ( ( ${#t1} * 150 ) + ( ${#t2} * 178 ) + ( ${#t3} * 190 ) + ( ${#t4} * 201 ) ) > 4560 && ${#t}!=oldlen)) {
       oldlen=${#t};
       t=`echo $t | sed 's/\/\(.\)[^\/][^\/]*\//\/\1\//'`;
       t1="${t//[^ijlIFT]}";
       t2="${t//[ijlIFTGoQMmWABEKPSVXYCDHNRUw]}";
       t3="${t//[^ABEKPSVXYCDHNRUw]}";
       t4="${t//[^GoQMmW]}";
     };

     PS1=$t

আমি টার্মিনাল শিরোনাম আপডেট করতে আসলে এটি ব্যবহার করি যাতে একাধিক ট্যাব সহ আমি কোন ট্যাবটি সোজা রাখতে পারি। এটি করার জন্য পূর্ণ .zshrc এখানে

এটি প্রাসঙ্গিক রাখায় এটি খুব সহজ এবং zsh এ আপনাকে একই ফর্ম্যাটে দ্রুত কোনও ডিরেক্টরি সম্পূর্ণ ট্যাব করতে দেয়। (যেমন টাইপিং cd /h/m/s/<tab>এতে স্বয়ংক্রিয়ভাবে পূর্ণ হবে cd /home/mydirectory1/second_directory)


পিএস 1 প্রম্পটটি কীভাবে সংজ্ঞায়িত করা যায়, ওপিতে উত্থাপিত প্রশ্নের ক্ষেত্রে এটি কীভাবে প্রযোজ্য?
অ্যান্থন

স্বচ্ছতার জন্য সম্পাদিত, PS t পিএস 1
রিচার্ড

0

এই পাইথন স্ক্রিপ্টটি ব্যবহার করার চেষ্টা করুন । আপনি যেমনভাবে আপনার প্রশ্নে চেয়েছিলেন ঠিক তেমন এটি পথের পৃথক বিভাগগুলি কেটে দেয়। এটি ইউনিকোড উপবৃত্ত ব্যবহার করে যা তিনটির পরিবর্তে কেবল একটি কলাম নেয়।

আপনার পথের উদাহরণ আউটপুট (যখন 30 টি অক্ষরের সীমা দেওয়া হয়):

/home/mydir…/second…/my_actua

এটি দ্রষ্টব্য যে এই সমাধানটি সঠিকভাবে ইউনিকোডকে ডিরেক্টরিগুলির নামে ব্যবহার করে পরিচালনা করে wcswidth${#PWD}, যা অন্য উত্তরগুলি ব্যবহার করেছে, এতে ইউটিএফ -8 অক্ষর থাকা কোনও পাথের চাক্ষুষ প্রস্থকে খারাপভাবে বিবেচনা করবে।

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