ব্যাশে টাইমার কীভাবে ব্যবহার করবেন?


30

আমার একটি টাইমার দরকার যা স্ক্রিপ্টের একেবারে শুরুতে শুরু হবে এবং শেষে থামবে।


2
দয়া করে, আপনি যে লক্ষ্যটি অর্জন করতে চান তা লিখুন। স্ক্রিপ্ট ওয়ার্কিং টাইম ইউজ timeকমান্ড (সময় ./script.sh) পরিমাপ করতে , বর্তমান সময়ের ব্যবহারের dateকমান্ড প্রিন্ট আউট করা ইত্যাদি।
নলখাগড়া


বেসিক লিনাক্স time yourprogram.shসেন্টিমিডি ব্যবহার করুন:, যে @ মারিয়াস কোটোফানা ব্যাখ্যা করেছেন
মার্টিজন ভ্যান

উত্তর:


29

আপনি যদি সেকেন্ডের মধ্যে সময়কাল চান তবে শীর্ষে ব্যবহার করুন

start=$SECONDS

এবং শেষে

duration=$(( SECONDS - start ))

যদি এটি সেকেন্ডের বেশি সময় নেয়?
পিথিকোস

@ পিথিকোস নীচে ফিলিপ গিবনস এর উত্তর দেখুন
xhienne

23

আপনি লিনাক্সের অন্তর্নির্মিত timeকমান্ডটি ব্যবহার করতে পারেন । ম্যান পৃষ্ঠা থেকে:

সময় কম্যান্ড [যুক্তি]

সময় নির্ধারণ করে যে COMMAND স্ট্রিং থেকে FORMAT দ্বারা ব্যবহৃত সংস্থানগুলি সম্পর্কে কোন তথ্য প্রদর্শন করবে। যদি কমান্ড লাইনে কোনও বিন্যাস নির্দিষ্ট না করা থাকে তবে TIME পরিবেশ পরিবর্তনশীল সেট করা থাকে তবে এর মান বিন্যাস হিসাবে ব্যবহৃত হয় its

cleanup.shস্ক্রিপ্ট সময় করতে , ব্যবহার করুন:

$ time cleanup.sh

1
timeআপনি ব্যবহার করছেন তা জানুন । hackernoon.com/…
কিমি 6zla

8

আমি বুঝতে পেরেছি এটি একটি বেশ পুরানো প্রশ্ন তবে যখনই আমি চাই / কিছু চালাতে কত সময় নিয়েছে তা জানতে আমার প্রয়োজনের জন্য এটি করার জন্য এই উপায়।

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

SECONDS=0আপনি রান সময় যা যা যাচাই করছেন তার আগে রাখুন । কোনও ভাল ফলাফল পাওয়ার জন্য কোনও ব্যবহারকারীর ইনপুট হওয়ার পরে এটি হওয়া দরকার তাই আপনি যদি তথ্যের জন্য অনুরোধ করেন, তা প্রম্পট (গুলি) এর পরে রাখুন।

তারপরে, আপনি যা যা পরীক্ষা করছেন তার শেষে রাখুন:

if (( $SECONDS > 3600 )) ; then
    let "hours=SECONDS/3600"
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" 
elif (( $SECONDS > 60 )) ; then
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $minutes minute(s) and $seconds second(s)"
else
    echo "Completed in $SECONDS seconds"
fi

আপনি যদি কেবল সেকেন্ডের মধ্যে সময়টি জানতে চান, আপনি উপরেরটি সহজ করতে পারেন:

echo "Completed in $SECONDS seconds"

উদাহরণ হিসাবে:

read -rp "What's your name? " "name"
SECONDS=0
echo "Hello, $name"
if (( $SECONDS > 3600 )) ; then
    let "hours=SECONDS/3600"
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" 
elif (( $SECONDS > 60 )) ; then
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $minutes minute(s) and $seconds second(s)"
else
    echo "Completed in $SECONDS seconds"
fi

3
যারা এ জাতীয় বিস্তৃত সময় বিন্যাস চান না তাদের জন্য একটি শর্টকাট: date +%T -d "1/1 + $SECONDS sec"(২৪ ঘন্টা-এরও কম সীমাবদ্ধ তবে আপনিও কিছু দিন যুক্ত করতে মানিয়ে নিতে পারেন)
xhienne

1
#!/bin/bash

start=$(date +%s)
#
# do something
sleep 10
#
#
end=$(date +%s)

seconds=$(echo "$end - $start" | bc)
echo $seconds' sec'

echo 'Formatted:'
awk -v t=$seconds 'BEGIN{t=int(t*1000); printf "%d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}'

1
হাই, ইউনিক্স এসই তে স্বাগতম! কোড-কেবল উত্তরগুলি খুব ভাল দেখাচ্ছে না, সম্ভবত আপনি ব্যাখ্যা করতে পারেন যে আপনার স্ক্রিপ্টটি কী করছে।
পিটার বলেছেন, মনিকা

0

@ আনাস্ক এই উত্তরের জন্য একটি চতুর সমাধান করুন, আমি কেবল $SECONDSনতুন তৈরির পরিবর্তে নেটিভ ব্যবহার করার পরামর্শ দিই

awk -v t=$SECONDS 'BEGIN{t=int(t*1000); printf "Elapsed Time (HH:MM:SS): %d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}'

printfএবং বিভাগটির উদ্দেশ্য হ'ল অতিবাহিত সেকেন্ডগুলিকে সংশ্লিষ্ট unityক্য সময়, মিনস, সেকেন্ডগুলিতে রূপান্তর করা।

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