সর্বশেষ কমান্ডটি PROMPT_COMMAND এ খালি ছিল কিনা তা বলুন


12

বাশ-এ, PROMPT_COMMAND এর ভিতরে থেকে, কোনও উপায় আছে কি বলার জন্য যে ব্যবহারকারী কেবল 'রিটার্ন' টিপুন এবং কোনও কমান্ড প্রবেশ করেনি?

উত্তর:


7

ইতিহাস নম্বরটি বাড়ানো হয়েছে কিনা তা পরীক্ষা করে দেখুন। বাতিল হওয়া প্রম্পট বা প্রম্পট যেখানে ব্যবহারকারী সবেমাত্র 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) সদৃশদের স্কোয়াশিং চালু করে থাকেন তবে এটি ভুল করে দুটি অভিন্ন কমান্ড ধারাবাহিকভাবে চালানোর পরে একটি ফাঁকা কমান্ডের প্রতিবেদন করবে।


ধন্যবাদ, গিলস আমি এখানে কিছু মিস করছি এটি কখনই চলবে বলে মনে হয় না, কারণ আক্ষরিক ফাংশনের প্রথম লাইনে 'ইকো হ্যালো' রাখলে কাজ হয় না, যদিও PROMPT_COMMAND = 'ইকো হ্যালো' করে। আমি ভেবেছিলাম এটি হিস্টসিএমডি_প্রিরিয়াস বনাম HISCMD_PREVIOUS ইস্যু হতে পারে তবে কোনও ডাইস নেই। আমি হাঁপাতে থাকব, তবে আপনার ব্যাশ ফু আমার থেকে পরিষ্কার লিগ হিসাবে মন্তব্য করছি।
ব্যবহারকারী 21

@ ব্যবহারকারীর আমি আরও টাইপস স্থির করেছি, বিশেষত ${HISTCMD_previous%%$'[\t ]'*}বিটটি অনুপস্থিত $'…'এবং `, ট্যাব বা স্পেসের পরিবর্তে t` বা স্থানের পরে কাটা শেষ হয়েছিল , তবে বাশ একটি ট্যাব মুদ্রণ করে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

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

4

একটি কার্যকারিতা আছে, তবে এর কিছু প্রয়োজনীয়তা রয়েছে:

আপনাকে $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
ব্যবহারকারী 21

1

আমি যে কি, একটি উপায় জানি না কোনটাই । তবে আপনি ব্যবহার করে একই প্রভাব পেতে পারেন

কিছু_কমন্ড_ বা_ফানশন ডিবাগ ফাঁদে ফেলুন

এই ইচ্ছার কারণ some_command_or_functionযে কোনো সময় আপনি একটি কমান্ড চালাতে বলা হবে। জটিল জিনিসটি হ'ল, যদি আপনি কেবল আঘাত করেন Enterতবে এটি বলা হবে না - যদি না আপনার কাছে একটি PROMPT_COMMAND সংজ্ঞায়িত হয়, তবে এই ক্ষেত্রে হিটিং EnterPROMPT_COMMAND কে আহ্বান জানায়, যা পরিবর্তে ফাঁদটিকে ট্রিগার করে।

আপনি যে ফলাফলটি চান তা অর্জন করার সবচেয়ে সহজ উপায় হ'ল একটি প্রোম্প্পকো কম ব্যবহারের পরিবর্তে ডিবাগ ট্র্যাপ ফাংশনটি সংজ্ঞায়িত করা। তবে আমি বলতে পারি না, কারণ আপনি কী ফলাফল চান তা আমি জানি না। যদি আপনি কেবল হিট করার সময় কিছু ঘটতে চান Enterএবং আপনি যখন কোনও কমান্ড টাইপ করেন তখন ঘটে যাওয়ার কিছু আলাদা / অতিরিক্ত হয়, তবে (এএফআইএইকি) আপনার একটি ডিবাগ ট্র্যাপ এবং একটি প্রোম্প্পকো কম্যান্ড ব্যবহার করা দরকার। দেখুন এই উত্তর এবং  এই এক একটি উপায় দুই মেকানিজম একসঙ্গে সুন্দরভাবে প্লে করতে পারেন।


0

(এটি যদি আমাকে মন্তব্যগুলি যুক্ত করার অনুমতি দেওয়া হত তবে এটি গৃহীত উত্তরের একটি মন্তব্য ছিল ...) @ স্ক্লিমম্যান, আপনি এর HISTTIMEFORMATমতো কিছুতে সেট করতে পারেন HISTTIMEFORMAT='%F %T 'এবং তারপরে সংরক্ষণ এবং তুলনা করতে পারেন history 1। এর কারণ মুছে ফেলা হয়েছে কমপক্ষে (সম্ভবত পুনর্বারিত) সর্বশেষ কমান্ডের টাইমস্ট্যাম্প প্রতিবার পরিবর্তিত হয় --- এবং HISSTIMEFORMATযথাযথভাবে সেট history 1করে টাইমস্ট্যাম্পটি প্রদর্শন করবে (বিপরীতে fc), এবং এভাবে পুনরাবৃত্ত আদেশের মধ্যেও পৃথক হয়।

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