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
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.
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')"
}
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
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).
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.
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