エコ前タイムスタンプ

エコ前タイムスタンプ

タイムスタンプを前に作成するより良い方法はありますか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メッセージを入れます。フォーマット文字列(例では)にテキストを挿入できます。たとえば、datedate+%R

date +"%R usb device already mounted"

便宜上、これをシェル関数に入れることもできます。たとえば、

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.

関連情報