বাশ-এ, PROMPT_COMMAND এর ভিতরে থেকে, কোনও উপায় আছে কি বলার জন্য যে ব্যবহারকারী কেবল 'রিটার্ন' টিপুন এবং কোনও কমান্ড প্রবেশ করেনি?
বাশ-এ, PROMPT_COMMAND এর ভিতরে থেকে, কোনও উপায় আছে কি বলার জন্য যে ব্যবহারকারী কেবল 'রিটার্ন' টিপুন এবং কোনও কমান্ড প্রবেশ করেনি?
উত্তর:
ইতিহাস নম্বরটি বাড়ানো হয়েছে কিনা তা পরীক্ষা করে দেখুন। বাতিল হওয়া প্রম্পট বা প্রম্পট যেখানে ব্যবহারকারী সবেমাত্র Enterচাপলেন তা ইতিহাসের সংখ্যা বাড়বে না।
ইতিহাসের সংখ্যাটি ভেরিয়েবলের মধ্যে পাওয়া যায় তবে এটি পাওয়া HISTCMD
যায় না PROMPT_COMMAND
(কারণ আপনি যা চান সেখানে পূর্ববর্তী কমান্ডের ইতিহাস নম্বর রয়েছে; যে কমান্ডটি PROMPT_COMMAND
নিজে চালায় সেটির ইতিহাসের নম্বর নেই)। আপনি আউটপুট থেকে নম্বর পেতে পারেন fc
।
prompt_command () {
HISTCMD_previous=$(fc -l -1); HISTCMD_previous=${HISTCMD_previous%%$'[\t ]'*}
if [[ -z $HISTCMD_before_last ]]; then
# initial prompt
elif [[ $HISTCMD_before_last = "$HISTCMD_previous" ]]; then
# cancelled prompt
else
# a command was run
fi
HISTCMD_before_last=$HISTCMD_previous
}
PROMPT_COMMAND='prompt_command'
মনে রাখবেন আপনি যদি ইতিহাসে ( HISTCONTROL=ignoredups
বা HISTCONTROL=erasedups
) সদৃশদের স্কোয়াশিং চালু করে থাকেন তবে এটি ভুল করে দুটি অভিন্ন কমান্ড ধারাবাহিকভাবে চালানোর পরে একটি ফাঁকা কমান্ডের প্রতিবেদন করবে।
${HISTCMD_previous%%$'[\t ]'*}
বিটটি অনুপস্থিত $'…'
এবং `,
ট্যাব বা স্পেসের পরিবর্তে t` বা স্থানের পরে কাটা শেষ হয়েছিল , তবে বাশ একটি ট্যাব মুদ্রণ করে।
একটি কার্যকারিতা আছে, তবে এর কিছু প্রয়োজনীয়তা রয়েছে:
আপনাকে $HISTCONTROL
সমস্ত কমান্ড, ডুপ্লিকেট এবং ফাঁকা স্থান সংরক্ষণ করতে হবে। সুতরাং সেট করুন:
HISTCONTROL=
এখন কল করতে একটি ফাংশন সংজ্ঞায়িত করুন $PROMPT_COMMAND
:
isnewline () {
# read the last history number
prompt_command__isnewline__last="$prompt_command__isnewline__curr"
# get the current history number
prompt_command__isnewline__curr="$(history 1 | grep -oP '^\ +\K[0-9]+')"
[ "$prompt_command__isnewline__curr" = "$prompt_command__isnewline__last" ] && \
echo "User hit return"
}
এখন, $PROMPT_COMMAND
ভেরিয়েবল সেট করুন :
PROMPT_COMMAND="isnewline"
আউটপুট দেখুন:
user@host:~$ true
user@host:~$ <return>
User hit return
user@host:~$ <space><return>
user@host:~$
last
একটির অনুরোধ থেকে পরেরটিতে সংরক্ষণ isnewline
করা হয় (কেবল prompt_command__isnewline__last
সংঘর্ষ এড়ানোর মতো একটি কম সাধারণ নাম বেছে নিন )।
HISTCONTROL="" function last_was_blank { local last_command="$(history 1)" if [[ "$last_was_blank_PREVIOUS_LINE" = "$last_command" ]] ; then echo "true" else echo "false" fi export last_was_blank_PREVIOUS_LINE="$last_command" } PROMPT_COMMAND=last_was_blank
আমি যে কি, একটি উপায় জানি না কোনটাই । তবে আপনি ব্যবহার করে একই প্রভাব পেতে পারেন
কিছু_কমন্ড_ বা_ফানশন ডিবাগ ফাঁদে ফেলুন
এই ইচ্ছার কারণ some_command_or_function
যে কোনো সময় আপনি একটি কমান্ড চালাতে বলা হবে। জটিল জিনিসটি হ'ল, যদি আপনি কেবল আঘাত করেন Enterতবে এটি বলা হবে না - যদি না আপনার কাছে একটি PROMPT_COMMAND সংজ্ঞায়িত হয়, তবে এই ক্ষেত্রে হিটিং EnterPROMPT_COMMAND কে আহ্বান জানায়, যা পরিবর্তে ফাঁদটিকে ট্রিগার করে।
আপনি যে ফলাফলটি চান তা অর্জন করার সবচেয়ে সহজ উপায় হ'ল একটি প্রোম্প্পকো কম ব্যবহারের পরিবর্তে ডিবাগ ট্র্যাপ ফাংশনটি সংজ্ঞায়িত করা। তবে আমি বলতে পারি না, কারণ আপনি কী ফলাফল চান তা আমি জানি না। যদি আপনি কেবল হিট করার সময় কিছু ঘটতে চান Enterএবং আপনি যখন কোনও কমান্ড টাইপ করেন তখন ঘটে যাওয়ার কিছু আলাদা / অতিরিক্ত হয়, তবে (এএফআইএইকি) আপনার একটি ডিবাগ ট্র্যাপ এবং একটি প্রোম্প্পকো কম্যান্ড ব্যবহার করা দরকার। দেখুন এই উত্তর এবং এই এক একটি উপায় দুই মেকানিজম একসঙ্গে সুন্দরভাবে প্লে করতে পারেন।
(এটি যদি আমাকে মন্তব্যগুলি যুক্ত করার অনুমতি দেওয়া হত তবে এটি গৃহীত উত্তরের একটি মন্তব্য ছিল ...) @ স্ক্লিমম্যান, আপনি এর HISTTIMEFORMAT
মতো কিছুতে সেট করতে পারেন HISTTIMEFORMAT='%F %T '
এবং তারপরে সংরক্ষণ এবং তুলনা করতে পারেন history 1
। এর কারণ মুছে ফেলা হয়েছে কমপক্ষে (সম্ভবত পুনর্বারিত) সর্বশেষ কমান্ডের টাইমস্ট্যাম্প প্রতিবার পরিবর্তিত হয় --- এবং HISSTIMEFORMAT
যথাযথভাবে সেট history 1
করে টাইমস্ট্যাম্পটি প্রদর্শন করবে (বিপরীতে fc
), এবং এভাবে পুনরাবৃত্ত আদেশের মধ্যেও পৃথক হয়।