বিচ্ছিন্ন সময় দেখানোর জন্য পিএস 1 প্রম্পট


10

আমি বর্তমানে আমার ব্যাশ প্রম্পটে বর্তমান সময়টি প্রদর্শন করতে এটি ব্যবহার করছি:

PS1=\[\e[0;32m\]\t \W>\[\e[1;37m\]

20:42:23 ~>

পূর্ববর্তী প্রম্পট থেকে কি অতিবাহিত সময় প্রদর্শন করা সম্ভব? যেমন:

00:00:00 ~> sleep 10
00:00:10 ~> sleep 20
00:00:20 ~>

এর সাথে মিল নেই কিছু কি ব্যাকগ্রাউন্ডের কোনও স্ক্রিপ্ট দ্বারা পিএস 1 পর্যায়ক্রমে পরিবর্তন করা সম্ভব?



না, সেই পোস্টে কোনও উত্তর নেই এবং আমি প্রত্যাশাটি কেবল তখনই পরিবর্তিত হবে যখন কোনও নতুন প্রম্পট প্রদর্শিত হবে।
টিজিংডার্ট

আপনি যা চান তা করার সত্যিই কোনও সম্ভাব্য উপায় নেই, না।
ডোপঘোতি

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

উত্তর:


10

এটি করার একটি উপায় হ'ল পিএস 1 সংশোধনকারী কোডটি কার্যকর করতে বাশের PROMPT_COMMAND বৈশিষ্ট্যটি ব্যবহার করা হবে। নীচের ফাংশনটি আমার আসল জমা দেওয়ার একটি আপডেট সংস্করণ; এটি একটি দুটি কম পরিবেশের ভেরিয়েবল ব্যবহার করে এবং বিদ্যমান ভেরিয়েবলগুলি ক্লোবারিং এড়ানোর চেষ্টা করার জন্য তাদের "_PS1_" দিয়ে উপসর্গ করে।

prompt_command() {
  _PS1_now=$(date +%s)
  PS1=$( printf "\[\e[0;32m\]%02d:%02d:%02d \W>\[\e[1;37m\] " \
           $((  ( _PS1_now - _PS1_lastcmd ) / 3600))         \
           $(( (( _PS1_now - _PS1_lastcmd ) % 3600) / 60 )) \
           $((  ( _PS1_now - _PS1_lastcmd ) % 60))           \
       )
  _PS1_lastcmd=$_PS1_now
}
PROMPT_COMMAND='prompt_command'
_PS1_lastcmd=$(date +%s)

জিনিসগুলি শুরু করতে এটি আপনার .bash_ প্রোফাইলে রাখুন।

নোট করুন যে sleepপ্রম্পট প্যারামিটারটির সাথে প্যারামিটারটি পেতে আপনাকে খুব দ্রুত টাইপ করতে হবে - সময়টি হ'ল প্রকৃত নির্দেশগুলির মধ্যে পার্থক্য, কম্যান্ডটি টাইপ করতে আপনাকে যে সময় লাগে তা সহ।

00:00:02 ~> sleep 5   ## here I typed really quickly
00:00:05 ~> sleep 3   ## here I took about 2 seconds to enter the command
00:00:10 ~> sleep 30 ## more slow typing
00:01:35 ~>

দেরীতে সংযোজন:

@ সাইরাস'এর এখন-মোছা উত্তরের উপর ভিত্তি করে, এখানে এমন একটি সংস্করণ দেওয়া হয়েছে যা অতিরিক্ত ভেরিয়েবলগুলি দিয়ে পরিবেশকে বিশৃঙ্খলা করে না:

PROMPT_COMMAND='
    _prompt(){
        PROMPT_COMMAND="${PROMPT_COMMAND%-*}-$SECONDS))\""
        printf -v PS1 "\[\e[0;32m\]%02d:%02d:%02d \W>\[\e[1;37m\] " \
                      "$(($1/3600))" "$((($1%3600)/60))" "$(($1%60))"
    }; _prompt "$((SECONDS'"-$SECONDS))\""

অতিরিক্ত দেরী সংযোজন:

বাশ সংস্করণ ৪.২ ( echo $BASH_VERSION) থেকে শুরু করে, আপনি dateএকটি নতুন প্রিন্টফ ফর্ম্যাট স্ট্রিং সহ বাহ্যিক কলগুলি এড়াতে পারবেন ; $(date +%s)সঙ্গে টুকরা প্রতিস্থাপন $(printf '%(%s)T' -1)সংস্করণ ৪.৩-এ শুরু-1 করে, "কোনও যুক্তি এখন নেই " আচরণের উপর নির্ভর করতে আপনি প্যারামিটারটি বাদ দিতে পারেন ।


এটি বাস্তব কাছাকাছি। এটি যখন আমি বাশ প্রম্পট থেকে অনুলিপি / পেস্ট করি তখন এটি কার্যকর হয় তবে আমি যখন এটি আমার .bashrc এ যুক্ত করার চেষ্টা করেছি তখন এটি "1451424431: কমান্ডটি পাওয়া যায় নি"
টিজিংডার্ট

হয়ত কিছুটা বেশি কপি / পেস্ট হয়েছে?
জেফ শ্যাচলার

এই শেষ সংস্করণটি কাজ করেছিল, ঠিক আমি যা চেয়েছিলাম! আমি মনে করি প্রম্পটের পরে পাঠ্যের রঙ সেট করতে এটি আমার ফাঁদে কিছু ছিল। ধন্যবাদ.
টিজিংডার্ট

আপনি যখন পুনরায় সেট করেন তখন $SECONDSশেল শুরু হওয়ার পরে সময়টি ট্র্যাক করা বন্ধ করে দেয়
মাইকসার্ভ 30'15

1
@ চেপার - ঠিক আছে, নিশ্চিত, তবে এটি শেলের সময় আর রাখে না। আমাকে ভুল করবেন না - আমি এটি উত্সাহিত করেছি কারণ এটি একটি ভাল উত্তর - তবে আমি মনে করি যে $SECONDSপ্রতিটি প্রম্পটের জন্য একটি ইন্টারেক্টিভ শেলটির নতুন সংজ্ঞা দেওয়া অপ্রত্যাশিত আচরণগুলি সরিয়ে ফেলতে পারে। রান-টাইম মূল্যায়নের সাথে যুক্ত যে কোনও কারণেই এটি ব্যবহার করতে পারে এমন কোনও শেল ফাংশন খারাপ ব্যবহার করবে।
মাইকজার্জ

4
PS1[3]=$SECONDS
PS1='${PS1[!(PS1[1]=!1&(PS1[3]=(PS1[2]=$SECONDS-${PS1[3]})/3600))
   ]#${PS1[3]%%*??}0}$((PS1[3]=(PS1[2]/60%60),  ${PS1[3]})):${PS1[1
   ]#${PS1[3]%%*??}0}$((PS1[3]=(PS1[2]%60),     ${PS1[3]})):${PS1[1
   ]#${PS1[3]%%*??}0}$((PS1[3]=(SECONDS),       ${PS1[3]})):'$PS1

এটি গণনা অনুসারে ফর্ম্যাটিং পরিচালনা করে - সুতরাং, এটি বেশ কয়েকবার প্রসারিত হওয়ার পরে এটি কোনও সাবশেল বা পাইপগুলি করে না।

এটি কেবল $PS1একটি অ্যারে হিসাবে আচরণ করে এবং অনুরোধগুলির মধ্যে যে কোনও / সমস্ত প্রয়োজনীয় রাষ্ট্র সঞ্চয় করতে / গণনা করতে উচ্চতর সূচকগুলি ব্যবহার করে। অন্য কোনও শেল অবস্থা প্রভাবিত হয় না।

00:00:46:[mikeserv@desktop tmp]$
00:00:01:[mikeserv@desktop tmp]$
00:00:00:[mikeserv@desktop tmp]$
00:00:01:[mikeserv@desktop tmp]$
00:00:43:[mikeserv@desktop tmp]$ sleep 10
00:00:33:[mikeserv@desktop tmp]$ sleep 10
00:00:15:[mikeserv@desktop tmp]$
00:00:15:[mikeserv@desktop tmp]$
00:00:02:[mikeserv@desktop tmp]$
00:02:27:[mikeserv@desktop tmp]$

আমি এটাকে একটু ভেঙে ফেলতে পারি ...

প্রথমে এর বর্তমান মান সংরক্ষণ করুন $SECONDS:

PS1[3]=$SECONDS

এরপরে, $PS1[0]স্ব-পুনরাবৃত্ত হওয়া এমনভাবে সংজ্ঞায়িত করুন যা $PS1[1-3]একই সাথে স্ব-উল্লেখের সময় সর্বদা সঠিক মানগুলি সেট করে । এই অংশটি পেতে আপনাকে শেল-ম্যাথের অভিব্যক্তিগুলি মূল্যায়ন করার ক্রমটি বিবেচনা করতে হবে। সর্বাধিক গুরুত্বপূর্ণ, শেল-ম্যাথ হ'ল শেল-ম্যাথের ব্যবসায়ের সর্বশেষ ক্রম। অন্য কিছুর আগে, শেলটি মানগুলি প্রসারিত করে। এইভাবে আপনি একটি গণিতের এক্সপ্রেশনটিতে শেল-ভেরিয়েবলের জন্য একটি পুরানো মানটি এটি ব্যবহার করে নির্ধারণের পরে উল্লেখ করতে পারেন $

এখানে প্রথমে একটি সাধারণ উদাহরণ রয়েছে:

x=10; echo "$(((x+=5)+$x+x))" "$x"

40 15

শেলটি প্রথমে $xযেখানে $ডলার-সাইন রেফারেন্স ব্যবহার করা হয়েছে তার মান স্থির করে সেই বিবৃতিটি মূল্যায়ন করবে এবং তাই অভিব্যক্তিটি হয়ে ওঠে:

(x+=5)+10+x

... তারপরে শেলটি 5 টি যোগ করে $xএবং এর পরে সম্পূর্ণ এক্সপ্রেশনটি প্রসারিত হয় x+10+x, যখন কেবলমাত্র রেফারেন্স ভেরিয়েবলের ক্ষেত্রে প্রকৃত নির্ধারিত মান ধরে রাখে। এবং সুতরাং গণিত প্রকাশের প্রসারিত মান 40, তবে এর চূড়ান্ত মান $x15।

যে মূলত কেমন $PS1সমীকরণ হিসাবে ভাল কাজ করে, ছাড়া গণিত সম্প্রসারণ / মূল্যায়ন অ্যারের সূচকগুলি শোষিত একটি অতিরিক্ত স্তর নেই।

PS1='${PS1[!(PS1[1]=!1&(...))]#...}...'

আমি কেন PS1[1]=!1সেখানে ব্যবহার করা বেছে নিলাম তা সত্যই আমি নিশ্চিত নই - আমার ধারণা এটি সম্ভবত নিরীহ নান্দনিকতা ছিল - তবে $PS1[1]এটি প্যারামিটার বিকল্পের জন্য এটি প্রসারিত করার সময় 0 টি বরাদ্দ করে । কিছুটা বিপরীতের জন্য এবং 0 এর জন্য এবং অন্য যে কোনও কিছুর মান সর্বদা 0 হবে তবে বুলিয়ান হিসাবে &&বাম-সর্বাধিক প্রাথমিক 0 হয় এবং তাই প্যারেন্টিথিক্যাল এক্সপ্রেশনটি প্রতিবার মূল্যায়ন করার পরে এটি শর্ট সার্কিট হয় না । অবশ্যই এটি গুরুত্বপূর্ণ, কারণ প্রথম এলিপসিসই যেখানে প্রাথমিক মানগুলি $PS1[2,3]সেট করা হয়।

যাইহোক, $PS1[1]প্রম্পট ড্রয়ের মধ্যে টেম্পার করা হলেও এখানে 0 হওয়ার আশ্বাস দেওয়া হয়েছে। সেখানে প্রথম বন্ধনীর মধ্যে ...

PS1[3]=(PS1[2]=$SECONDS-${PS1[3]})/3600

... $PS1[2]পার্থক্য নির্ধারিত হয় $PS1[3]এবং $SECONDS, এবং $PS1[3]যে মান এবং 3600. সমস্ত মান এখানে সক্রিয়া করছে ভাগফল নির্ধারিত হয়। এবং তাই:

${PS1[1]#${PS1[3]%%*??}0}

... যদি সেখানে কমপক্ষে দুটি অঙ্ক থাকে $PS1[3]তবে সেখানে অভ্যন্তরীণ সম্প্রসারনটি বাতিল হয়, এবং আমরা জানি $PS1[1]0 কারণ এটি যদি $PS1[3]কিছুতেই প্রতিস্থাপন করা যায় $PS1[1]তবে অন্যটিও এর মানতে প্রসারিত হয়। এই পদ্ধতিতে প্রতিটি পুনরাবৃত্তির জন্য কেবল একক অঙ্কের মানগুলি $PS1[3]একটি অগ্রণী শূন্যকে প্রসারিত করবে এবং $PS1[3]তত্ক্ষণাত্ সেগুলি নিজেই প্রসারণ করা হবে যখন একই সাথে পরবর্তী প্রতিটি ঘন্টা, মিনিট, সেকেন্ডের জন্য পরবর্তী ক্রমান্বয়ে ছোট মান নির্ধারিত হবে।

ধুয়ে ফেলুন এবং পুনরাবৃত্তি করুন, সর্বশেষ পুনরাবৃত্তি হওয়া অবধি যখন $PS1[3]ডাব্লু / বর্তমান মানটি ওভাররাইট করা $SECONDSহবে যাতে $SECONDSপ্রম্পটটি পরবর্তী আঁকলে এটি আরও একবারের সাথে তুলনা করা যেতে পারে ।


1

আমি এখনও অবধি সবচেয়ে ভাল সমাধানটি খুঁজে পেয়েছি: https://github.com/jichu4n/bash-command-timer

কোনটি [ 1s011 | May 25 15:33:44 BST ]মৃত্যুদন্ড কার্যকর হওয়া কমান্ডের পরে ডানদিকে প্রান্তিকভাবে প্রবাহিত সময়টিকে প্রিন্ট করে, তাই এটি আপনাকে পিএস 1 এলোমেলো করে না।

পুরো স্ট্রিং এবং সময়ের ফর্ম্যাটটি কনফিগারযোগ্য। এমনকি রঙ এবং স্পষ্টতা কনফিগারযোগ্য। আমি জানি এটি কিছু সংখ্যালঘুদের পক্ষে কিছুটা হলেও হতে পারে তবে এটি দুর্দান্ত cool

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