タイムスタンプを前に作成するより良い方法はありますか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"
便宜上、これをシェル関数に入れることもできます。たとえば、
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.