有没有更好的方法在 前面创建时间戳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
答案1
您可以跳过echo
,只需将消息放入date
命令中即可。date
允许您将文本插入格式字符串(+%R
在您的示例中)。例如:
date +"%R usb device already mounted"
为了方便起见,您也可以将其放入 shell 函数中。例如:
echo_time() {
date +"%R $*"
}
echo_time "usb device already mounted"
如果您要多次重复使用,这是一种清洁剂。
答案2
这是一种更健壮和可移植(POSIX)的方法,特别是允许%
作为参数保持未处理状态的方法:
echo_time() {
date +"%H:%M $(printf "%s " "$@" | sed 's/%/%%/g')"
}
答案3
您可以为以下内容创建变量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
答案4
当我做这样的事情时,我通常希望所有行(包括任何程序输出)都带有时间戳。因此,我会使用这样的东西:
#!/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 下面指出的,各个程序在发送到管道时可能会缓冲其输出。当然,当程序退出时,这些缓冲区将被刷新,因此在最坏的情况下,时间戳将显示程序退出的时间(如果它缓冲其输出并且没有打印足够的内容来填充缓冲区)。然而,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.