एक गूंज से पहले टाइमस्टैम्प


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जब तक आपके संदेश में कोई %संकेत नहीं होगा, तब तक आप क्या करेंगे । बहुत मजबूत समाधान नहीं है।
derobert

1
@derobert क्योंकि कार्यान्वयन एक समारोह में छिपा हुआ है, echo_timeबस ओपी की तारीख + इको निर्माण का उपयोग कर सकता है
इज़काता

मैं बस "$ @" को "$ @" (बाद में उपयोग करने की आदत में बदलने के लिए) बदल
दूंगा

कैसे एक पाइप में उपयोग करने के लिए?
erikbwork

6

यह करने के लिए एक और अधिक मजबूत और पोर्टेबल (POSIX) तरीका है, विशेष रूप से एक जो %एक तर्क के रूप में असंसाधित रहने की अनुमति देता है:

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
यह अच्छा है क्योंकि यह केवल तीन बार के बजाय एक बार तारीख कहता है।
evilsoup

2
यह अच्छा है जब स्क्रिप्ट लंबे समय तक नहीं चलती है, लेकिन यह गलत तारीख होगी जब यह लंबा होगा।
TaXXoR

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

(ध्यान दें कि वे stderr पर गूँजते हैं, जो वास्तव में बेहतर हो सकते हैं)।


1

जब मैं इस तरह की चीजें करता हूं, तो मैं चाहता हूं कि सभी लाइनें (किसी भी प्रोग्राम आउटपुट सहित) टाइमस्टैम्प हो। इस प्रकार, मैं कुछ इस तरह का उपयोग करेंगे:

#!/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कमांड की जाँच करें जो कि अधिक जानकारी का हिस्सा है। यह एक समान पर्ल स्क्रिप्ट है, लेकिन टाइमस्टैम्प प्रारूप, आदि के लिए विभिन्न विकल्पों के साथ
derobert

@derobert - आप यह क्यों नहीं लिख रहे हैं कि यह कैसे करना है 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 ने लिखा है। आपको समय से पहले कमांड और चर विस्तार से स्ट्रिंग की रक्षा करनी होगी।
15 अक्टूबर को मैनटवर्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.