প্রতিটি কমান্ডে একটি 'যুক্ত' ওরফে জোর করে


11

প্রতিটি কমান্ডে জোর করে কোনও টাইমিং ওরফে (এটির উচ্চারণের আরও ভাল উপায়ের অভাবের জন্য) যুক্ত করা কি সম্ভব bash?

উদাহরণস্বরূপ, আমি একটি নির্দিষ্ট ব্যবহারকারীর কাছে থাকতে চাই যিনি যখনই কোনও কমান্ড চালিত হয়, এটি সর্বদা হয় dateআগে এবং পরে সঙ্গে আবৃত থাকে , বা time

এটি কি সম্ভব, এবং যদি তা হয় তবে কীভাবে?


আমি আগে চেয়েছিলাম, এবং ঠিক এটি করার কোনও উপায় খুঁজে পাইনি। যেমন কালেব বলেছেন, আপনি ব্যবহার করতে পারেন preexecতবে আপনি এটি preexec(যেমন preexec() { time $1; }) এর মধ্যে চালাতে চান না , কারণ শেলটি এখনও এটির পরে তা চালায় preexec। তাই আমরা যা করতে পারি তা হ'ল অনুরূপ।
মিকেল

@ মাইকেল আমি মনে করি আপনি preexec()কমান্ডটি আনার মাধ্যমে যা কিছু ঘটছে তা প্রকৃতপক্ষে মোড়কে ফাংশনটি ব্যবহার করতে পারেন, এটি ফাংশনের অভ্যন্তর থেকে নিজেকে চালিত করে, পরে কোনও ধরণের ত্রুটি ফিরে আসবে যাতে শেলটি নিজেই কমান্ডটি চালাতে না পারে।
কালেব

উত্তর:


10

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

print_command_wall_clock_time () {
  echo Wall clock time: \
    $(($(date +%s) - $(HISTTIMEFORMAT="%s ";
                       set -o noglob;
                       set $(history 1); echo $2)))
}
PROMPT_COMMAND=print_command_wall_clock_time$'\n'"$PROMPT_COMMAND"

এটি আপনাকে কেবল দ্বিতীয় রেজোলিউশন দেয় এবং কেবল প্রাচীর ঘড়ির সময়। আপনি যদি আরও ভাল রেজোলিউশন চান, আপনার একটি বাহ্যিক dateকমান্ড ব্যবহার করতে %Nহবে যা ন্যানোসেকেন্ডগুলির জন্য ফর্ম্যাটটি সমর্থন করে এবং সময় সময় কমান্ড চালানোর আগে DEBUGকল dateকরার জন্য ট্র্যাপটি ব্যবহার করতে হবে ।

call_date_before_command () {
  date_before=$(date +%s.%N)
}
print_wall_clock_time () {
  echo Wall clock time: \
    $((date +"$date_before - %s.%N" | bc))
}
trap call_date_before_command DEBUG
PROMPT_COMMAND=print_command_wall_clock_time

এমনকি DEBUGফাঁদ দিয়েও, আমি মনে করি না যে প্রতিটি কমান্ডের জন্য স্বয়ংক্রিয়ভাবে প্রসেসরের সময় প্রদর্শন করা বা প্রম্পটের অনুরোধের চেয়ে বৈষম্যমূলক কোনও উপায় রয়েছে।


আপনি যদি আলাদা শেল ব্যবহার করতে ইচ্ছুক হন তবে zsh এ প্রতিটি কমান্ডের জন্য কীভাবে একটি সময় প্রতিবেদন পাবেন তা এখানে (এটি অন্যান্য কার্য্যে সাধারণীকরণ করে না):

REPORTTIME=0

আপনি REPORTTIMEযে কোনও পূর্ণসংখ্যা মানকে সেট করতে পারেন , সময় সংক্রান্ত তথ্য কেবলমাত্র সেই কমান্ডগুলির জন্য প্রদর্শিত হবে যা প্রসেসরের সময়ের এই কয়েক সেকেন্ডের চেয়ে বেশি সময় ব্যবহার করে।

Zsh সিএসএস থেকে এই বৈশিষ্ট্যটি নিয়েছিল যেখানে ভেরিয়েবল বলা হয় time


3

আপনার বিকল্পগুলি এখানে আপনার শেলের উপর নির্ভর করবে। ইন zshএকটি সুবিধাজনক হুক ফাংশন বলা preexec()যে অধিকার কোনো ইন্টারেক্টিভ শেল কমান্ড সামনে চালানো হয়। এই নামের সাথে একটি ফাংশন তৈরি করে, আপনি জিনিসগুলি সম্পাদন করতে পারেন। আপনি এমন একটি ফাংশনও অনুসরণ করতে পারেন precmd()যা বলা হয় পরবর্তী প্রম্পট আঁকার ঠিক আগে চলবে যা আপনার কমান্ড শেষ হওয়ার পরে ঠিক হবে ।

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

এই উদাহরণস্বরূপ, আমরা কমান্ড চালানোর আগে আমাদের নিজের জন্য একটি বেঞ্চমার্ক টাইমস্ট্যাম্প তৈরি করব preexec()এবং তারপরে কমান্ডটি ব্যবহার করে ব্যয় করা সময় গণনা করব precmd()এবং প্রম্পটের আগে এটি আউটপুট করুন বা লগ করে ফেলুন। উদাহরণ:

preexec() {
   CMDSTART=$(date +%s%N)
}
precmd() {
   CMDRUNTIME=$(($(date +%s%N)-$CMDSTART))
   echo "Last command ran for $CMDRUNTIME nanoseconds."
}

দ্রষ্টব্য: এই নির্দিষ্ট উদাহরণের জন্য, আরও সহজ বিল্টিন ফাংশন রয়েছে। আপনাকে যা করতে হবে তা হ'ল জেডএসএইচে রানটাইম রিপোর্টিং চালু করা এবং এটি স্বয়ংক্রিয়ভাবে এটি করবে।

$ export REPORTTIME=0
$ ls -d
./
ls -BF --color=auto -d  0.00s user 0.00s system 0% cpu 0.002 total

একটি ব্যবহারিক বাস্তবায়ন সালে preexec(), আমি এটা দেখি শেল ভিতরে চলছে ব্যবহার tmuxবা screenট্যাব নাম প্রদর্শিত হবে বর্তমানে চলমান কমান্ড মূল প্রজেক্টের সম্পর্কে তথ্য প্রেরণ করতে যদি তাই হয়, এবং।

দুর্ভাগ্যক্রমে ব্যাশে এই সামান্য প্রক্রিয়াটি বিদ্যমান নেই। এটির প্রতিলিপি দেওয়ার জন্য এখানে একজনের প্রচেষ্টা । অনুরূপ নিফটি সামান্য হ্যাকের জন্য গিলসের উত্তরও দেখুন ।




এই বাশ পাওয়া যেত!
ওয়ারেন

দেখুন গিলেজ এর এবং অন্যদের লিঙ্ক, এটা একটু অতিরিক্ত বাজে কাজে ব্যস্ত সঙ্গে ব্যাশ মধ্যে বাস্তবায়নযোগ্য নয়। আবার, আপনি শুধু zsh চালান না কেন? এটি একটি দোলনা শেল যা কেবলমাত্র এটির চেয়ে বেশি ভাল কারণগুলির সাথে রয়েছে!
কালেব

2
আপনি যদি zsh ব্যবহার করছেন তবে এটি করার আরও একটি ভাল উপায় আছে। রিপোর্টটাইম এনভায়রনমেন্ট ভেরিয়েবল সেট হয়ে গেলে নির্ধারিত সময়ের তথ্য আউটপুট দেয় (যদি আপনি এর সামনে 'সময়' দিয়ে কমান্ডটি চালিত করেন) যে কোনও কমান্ডের জন্য POR রিপোর্ট রিপোর্ট সেকেন্ডের চেয়ে বেশি সময় নেয় longer কেবল এটি 0 তে সেট করুন এবং এটি প্রতিটি কমান্ডের জন্য আপনাকে ব্যবহারকারী / সিস্টেমে ব্রেকডাউন করার সময় বলতে হবে boot
জোসেফ গারভিন

1

সবচেয়ে সহজ উপায় সম্ভবত সেট করা হবে PROMPT_COMMANDবাশ ভেরিয়েবলগুলি দেখুন :

PROMPT_COMMAND
যদি সেট করা থাকে তবে প্রতিটি প্রাথমিক প্রম্পট ( $PS1) প্রিন্ট করার আগে নির্ধারিত আদেশটি মান হিসাবে ব্যাখ্যা করা হয় ।

উদাহরণস্বরূপ, কোনও বিদ্যমান প্রম্পট কমান্ড ওভাররাইট করা এড়াতে, আপনি এটি করতে পারেন:

PROMPT_COMMAND="date ; ${PROMPT_COMMAND}"

এটি সম্পর্কে জানতেন না - দেখে মনে হচ্ছে একটি ভাল শুরু, @ সিজেএম
ওয়ারেন

1
এটি একটি শুরু, তবে কমান্ড কখন চালিত হয়েছিল তা জানার সমস্যাটির সমাধান করে না। প্রম্পটটি নিজেই কমান্ডটি টাইপ করে চালানোর কয়েক মিনিট বা ঘন্টা বা কয়েক দিন আগে আঁকতে পারে।
কালেব

0

csh/ tcshএই বৈশিষ্ট্যটির জন্য সর্বোত্তম সমর্থন রয়েছে (এবং সর্বদা এটি ছিল)।

  The `time` shell variable can be set to execute the time builtin  command
  after the completion of any process that takes more than a given number
  of CPU seconds.

অন্য কথায়, set time=1সিপু সময়ের ১ সেকেন্ডেরও বেশি সময় নেয় এমন কোনও কমান্ড দ্বারা গ্রাস করা সময় (সিস্টেম, ব্যবহারকারী, অতিবাহিত) মুদ্রণ করবে। সরল set timeসমস্ত কমান্ডের জন্য মুদ্রণ সময় সক্রিয় করতে সক্ষম করে।

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