回声之前的时间戳

回声之前的时间戳

有没有更好的方法在 前面创建时间戳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.

相关内容