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প্রম্পটটি পরবর্তী আঁকলে এটি আরও একবারের সাথে তুলনা করা যেতে পারে ।