yankı öncesi zaman damgası


12

Bir önünde zaman damgası oluşturmak için daha güzel bir yol var echomı?

Şu anda bu şekilde yapıyorum:

#!/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

Çıktı şöyle görünmelidir:

10:36 usb device already mounted

Yanıtlar:


22

Atlayabilir echove mesajı datekomuta koyabilirsiniz . datebiçim dizesine metin eklemenize olanak tanır ( +%Rörneğin). Örneğin:

date +"%R usb device already mounted"

Kolaylık sağlamak için bir kabuk işlevine de atabilirsiniz. Örneğin:

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

echo_time "usb device already mounted"

Bu, birçok kez yeniden kullanacaksanız daha temizdir.


6
echo_timeiletinizde %oturum açana kadar beklediğinizi yapar. Çok sağlam bir çözüm değil.
derobert

1
@derobert Uygulama bir işlev içinde gizli echo_timeolduğu için, sadece OP'nin tarih + yankı yapısını kullanabilir
Izkata

Ben sadece "$ *" değiştirmek "$ @" (daha sonra kullanma alışkanlığı almak için)
Olivier Dulac

bir boruda nasıl kullanılır?
erikbwork

6

İşte bunu yapmak için daha sağlam ve taşınabilir (POSIX) bir yol, özellikle %de bir argüman olarak işlenmemiş kalmanıza izin veren bir yol:

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

5

Aşağıdakiler için bir değişken oluşturabilirsiniz 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
Bu güzel, çünkü tarihi üç kez değil, bir kez çağırıyor.
evilsoup

2
Komut dosyası uzun sürmediğinde bu güzel, ancak daha uzun olacağı yanlış tarihe sahip olacak.
TaXXoR

4

İle ksh93ve son sürümleri bash:

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

İle zsh:

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

Veya "$@"parçada hızlı bir şekilde genişlemeyi önlemek için :

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

Eski sürümleri için hacky bir yol bash:

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

Aslında, eğer nokta şu ise:

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

Şunları yapabilirsiniz:

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

Veya bir alt kabuğu çatallamaktan kaçınmak için:

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

Sonra:

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

(bunların aslında tercih edilebilecek stderr'de yankılantığını unutmayın).


1

Böyle şeyler yaptığımda, genellikle tüm satırların (herhangi bir program çıkışı dahil) zaman damgası olmasını istiyorum. Böylece, böyle bir şey kullanırdım:

#!/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()."] $_"'

Stephane'nin aşağıda belirttiği gibi, bireysel programlar bir boruya gönderildiğinde çıktılarını tamponlayabilir. Tabii ki, bu arabellekler programdan çıkıldığında temizlenecektir, en kötü ihtimalle zaman damgaları programdan çıkıldığında gösterilecektir (çıktısını tamponlar ve arabelleği dolduracak kadar yazdırmazsa). Ancak, echozaman damgalarının hepsi doğru olacaktır.

Test için çalıştırılabilir bir örnek olarak:

#!/bin/sh

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

Çıktı:

[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.

Ancak, çıktı bir boruya gittiğinde, uygulamalar çıktılarını arabelleğe almaya başlar, bu nedenle zamanlamalar yazdırıldıkları zamanı yansıtmayabilir.
Stéphane Chazelas

2
tsMoreutils'in bir parçası olan komutu kontrol etmenizi öneririm. Benzer bir perl betiği, ancak zaman damgası biçimi, vb. İçin çeşitli seçeneklerle
derobert

@derobert - bunu nasıl yapılacağını neden yazmıyorsun ts? Burada en iyi seçenek olurdu gibi görünüyor.
slm

1

İle zaman damgaları oluşturma ts

aracı yükleyin ts(paketin bir parçası moreutils):

sudo apt-get install moreutils

Bir çıktıya zaman damgası ekleme:

echo "foo" | ts

çıktı:

Sep 03 14:51:44 foo

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

1
Sadece denediğimde bu işe yaramadı.
slm

Tıpkı @slm'nin yazdığı gibi. Dizeyi erken komut ve değişken genişletmelerden korumalısınız.
manatwork
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.