প্রতিধ্বনির আগে টাইমস্ট্যাম্প


12

কোনটির সামনে টাইমস্ট্যাম্প তৈরি করার একটি দুর্দান্ত উপায় রয়েছে echo?

বর্তমানে আমি এটি এইভাবে করি:

#!/bin/sh

if mount | grep -q /mnt/usb; then
        echo `date +%R\ ` "usb device already mounted"
else
        echo `date +%R\ ` "mounting usb device..."
        mount -t msdosfs /dev/da0s1 /mnt/usb

        if mount | grep -q /mnt/usb; then
                echo `date +%R\ ` "usb device successfully mounted"
        fi
fi

আউটপুটটি দেখতে কিছুটা দেখতে পাওয়া উচিত:

10:36 usb device already mounted

উত্তর:


22

আপনি এড়িয়ে যেতে পারেন echo, এবং বার্তাটি কেবল dateকমান্ডের মধ্যে রাখতে পারেন । dateআপনাকে পাঠ্যটি ফর্ম্যাট স্ট্রিংয়ের মধ্যে প্রবেশ করতে দেয় ( +%Rআপনার উদাহরণে)। উদাহরণ স্বরূপ:

date +"%R usb device already mounted"

আপনি এটিকে সুবিধার্থে শেল ফাংশনে ফেলে দিতে পারেন। উদাহরণ স্বরূপ:

echo_time() {
    date +"%R $*"
}

echo_time "usb device already mounted"

আপনি যদি এটি বহুবার ব্যবহার করতে যাচ্ছেন তবে এটি একটি ক্লিনার।


6
echo_timeআপনার বার্তায় কোনও %সাইন ইন না হওয়া পর্যন্ত আপনি যা প্রত্যাশা করছেন তা করবে। খুব শক্ত সমাধান নয়।
ডার্বোবার্ট

1
@ মডেলবার্ট বাস্তবায়ন কোনও কার্যক্রমে লুকিয়ে থাকার কারণে, কেবলমাত্র ওপি'র echo_timeতারিখ + ইকো কনস্ট্রাক্ট ব্যবহার করতে পারত
ইজকাটা

আমি কেবল "$ @" দ্বারা "$ @" পরিবর্তন করেছি (পরে ব্যবহারের অভ্যাস পেতে)
অলিভিয়ার ডুলাক

পাইপে কীভাবে ব্যবহার করব?
এরিকবওয়ার্ক

6

এটি করার জন্য এখানে আরও দৃust় এবং পোর্টেবল (পসিক্স) উপায় রয়েছে, বিশেষত এমন একটি যা %যুক্তি হিসাবে অপসারণ করা যায়:

echo_time() {
    date +"%H:%M $(printf "%s " "$@" | sed 's/%/%%/g')"
}

5

আপনি এর জন্য একটি পরিবর্তনশীল তৈরি করতে পারেন date +%R:

#!/bin/sh

T=$(date +%R)

if mount | grep -q /mnt/usb; then
        echo "$T usb device already mounted"
else
        echo "$T mounting usb device..."
        mount -t msdosfs /dev/da0s1 /mnt/usb

        if mount | grep -q /mnt/usb; then
                echo "$T usb device successfully mounted"
        fi
fi

3
এটি দুর্দান্ত কারণ এটি কেবল তিনবারের পরিবর্তে কেবল একবার তারিখ কল করে।
অরিসুপ

2
স্ক্রিপ্টটি বেশি দিন স্থায়ী না হলে এটি দুর্দান্ত, তবে এটির দীর্ঘতর হওয়ার ভুল তারিখটি থাকবে।
টেক্সএক্সআর

4

এর সাথে ksh93এবং সাম্প্রতিক সংস্করণগুলি bash:

ts_echo() {
  printf '%(%R)T: %s\n' -1 "$*"
}

সহ zsh:

ts_echo() print -P %T: "$@"

বা "$@"অংশে তাত্ক্ষণিক প্রসার এড়াতে :

ts_echo() echo ${(%):-%T}: "$@"

এর পুরানো সংস্করণগুলির জন্য একটি হ্যাকি উপায় bash:

ts_echo() (
  PS4="\A"
  set -x; : "$@"
)

আসলে, যদি কথাটি হয়:

echo "<timestamp>: doing cmd args..."
cmd args...

আপনি করতে পারেন:

ts() (
  PS4='\A: doing '
  set -x; "$@"
)
ts cmd args...

অথবা সাব শেলটি কাঁটাচামচ করা এড়াতে:

ts() {
  local PS4='\A: doing ' ret
  set -x; "$@"
  { ret=$?; set +x; } 2> /dev/null
  return "$ret"
}

তারপর:

$ ts echo whatever
14:32: doing echo whatever
whatever

(নোট করুন যে এগুলি স্ট্যাডারে প্রতিধ্বনিত হয়েছে, যা আসলে পছন্দনীয় হতে পারে)।


1

আমি যখন এই জাতীয় জিনিসগুলি করি তখন আমি সাধারণত সব লাইনে (কোনও প্রোগ্রাম আউটপুট সহ) টাইমস্ট্যাম্প করা চাই to সুতরাং, আমি এই জাতীয় কিছু ব্যবহার করব:

#!/bin/sh

(
    if mount | grep -q /mnt/usb; then
        echo "usb device already mounted"
    else
        echo "mounting usb device..."
        mount -t msdosfs /dev/da0s1 /mnt/usb

        if mount | grep -q /mnt/usb; then
            echo "usb device successfully mounted"
        fi
    fi
) 2>&1 | perl -ne 'print "[".localtime()."] $_"'

স্টিফেন নীচে উল্লেখ করেছেন যে, পাইপ প্রেরণ করার সময় পৃথক প্রোগ্রামগুলি তাদের আউটপুট বাফার করতে পারে। অবশ্যই, প্রোগ্রামটি প্রস্থান করার সময় এই বাফারগুলি ফ্লাশ করা হবে যখন প্রোগ্রামটি বেরিয়ে আসে তখন টাইমস্ট্যাম্পগুলি প্রদর্শিত হবে (যদি এটি এর আউটপুটটি বাফার করে এবং বাফারটি পূরণ করার জন্য পর্যাপ্ত পরিমাণে মুদ্রণ না করে)। তবে echoটাইমস্ট্যাম্পগুলি সমস্ত সঠিক হবে।

পরীক্ষার জন্য একটি চলমান নমুনা হিসাবে:

#!/bin/sh

(
    echo "Doing something"
    sleep 5
    echo "Doing something else..."
    ls /some/file
    sleep 8
    echo "Done."
) 2>&1 | perl -ne 'print "[".localtime()."] $_"'

আউটপুট:

[Thu Aug 29 07:32:37 2013] Doing something
[Thu Aug 29 07:32:42 2013] Doing something else...
[Thu Aug 29 07:32:42 2013] ls: cannot access /some/file: No such file or directory
[Thu Aug 29 07:32:50 2013] Done.

তবে মনে রাখবেন যে একবার আউটপুট কোনও পাইপে চলে যাওয়ার পরে, অ্যাপ্লিকেশনগুলি তাদের আউটপুটটি বাফার করতে শুরু করে, তাই সময়গুলি তারা মুদ্রণের সময় প্রতিফলিত না করে।
স্টাফেন চেজেলাস

2
আমি tsকমান্ডটি যা আরও বেশি অংশের অংশ তা পরীক্ষা করে দেখার পরামর্শ দিই। এটি একটি অনুরূপ পার্ল স্ক্রিপ্ট, তবে টাইমস্ট্যাম্প ফর্ম্যাট ইত্যাদির জন্য বিভিন্ন বিকল্প সহ
ডার্বার্ট

@ডারবার্ট - আপনি কীভাবে এটি ব্যবহার করে লিখবেন না ts? মনে হচ্ছে এটি এখানে সেরা বিকল্প হবে।
slm

1

সাথে টাইমস্ট্যাম্প তৈরি করা হচ্ছে ts

সরঞ্জামটি ইনস্টল করুন ts(প্যাকেজের অংশ moreutils):

sudo apt-get install moreutils

একটি আউটপুটে একটি টাইমস্ট্যাম্প যুক্ত করা:

echo "foo" | ts

আউটপুট:

Sep 03 14:51:44 foo

-1
alias echo="d=$(date +%Y-%m-%d); echo $d "
echo hola

1
আমি যখন চেষ্টা করেছি তখন এটি কাজ করে না।
slm

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