web-dev-qa-db-fra.com

horodatage avant un écho

Il existe un moyen plus agréable de créer des horodatages devant un echo?

Actuellement, je le fais de cette façon:

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

La sortie devrait ressembler à quelque chose comme ça:

10:36 usb device already mounted
12
TaXXoR

Vous pouvez sauter le echo et simplement mettre le message dans la commande date. date vous permet d'insérer du texte dans la chaîne de format (+%R Dans votre exemple). Par exemple:

date +"%R usb device already mounted"

Vous pouvez également le jeter dans une coque de la commodité. Par exemple:

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

echo_time "usb device already mounted"

Ceci est un nettoyeur si vous allez la réutiliser plusieurs fois.

22
David Baggerman

Voici une façon plus robuste et portable (POSIX) de le faire, en particulier celle qui permet de % Pour rester non transformé comme un argument:

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

Vous pouvez créer une variable pour 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
5
Radu Rădeanu

Avec ksh93 et versions récentes de bash:

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

Avec zsh:

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

Ou pour éviter une expansion rapide dans le "$@" partie:

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

Un chemin hacky pour les anciennes versions de bash:

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

En fait, si le but est de faire:

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

Vous pourriez faire:

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

Ou pour éviter de fourrer une sous-shell:

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

Puis:

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

(Notez que ceux-ci sont résonnés sur Sterrr, qui peuvent être préférables).

4
Stéphane Chazelas

Quand je fais des choses comme ça, je veux habituellement toutes les lignes (y compris toute sortie de programme) à horodatées. Ainsi, j'utiliser quelque chose comme ceci:

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

Comme Stephane souligne ci-dessous, les programmes individuels peuvent leur tampon de sortie lorsqu'il est envoyé à un tuyau. Bien sûr, ces tampons seront vidées lorsque les sorties du programme afin, au pire, les horodatages montreront lorsque le programme est sorti (si elle tamponne sa sortie et n'imprime pas assez pour remplir la mémoire tampon). Cependant, le echo horodatages seront tous exacts.

Comme un échantillon runnable pour le test:

#!/bin/sh

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

Sortir:

[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.
1
Dean Serenevy

Créer des horodatages avec ts

installez l'outil ts (partie de l'emballage moreutils):

Sudo apt-get install moreutils

Ajout d'un horodatage à une sortie:

echo "foo" | ts

sortir:

Sep 03 14:51:44 foo
1
TaXXoR