В настоящее время VirtualBox является бесплатным для персонального использования - включая профессиональное персональное использование. Последний изменился (на включение профессионального персонального использования) когда Oracle aquired Sun. Это может возвратить любое время.
Microsoft Virtual PC все еще свободна - но я не уверен, работает ли она на Windows 7 или выше.
OpenSource является Linux-KVM. Едва ли OpenSource (просто некоторые Версии) является XEN. Самые свободные дистрибутивы Linux OpenSource теперь включают KVM (например, Ubuntu LTS).
Вы могли пропустить echo
, и просто вставленный в сообщение date
команда. date
позволяет Вам вставлять текст в строку формата (+%R
в Вашем примере). Например:
date +"%R usb device already mounted"
Можно также бросить его в функцию оболочки для удобства. Например:
echo_time() {
date +"%R $*"
}
echo_time "usb device already mounted"
Это - инструмент для очистки, если Вы собираетесь снова использовать его много раз.
Можно создать переменную для 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
Вот более устойчивое и портативное (POSIX) способ сделать это, особенно то, которое допускает %
остаться необработанным как аргумент:
echo_time() {
date +"%H:%M $(printf "%s " "$@" | sed 's/%/%%/g')"
}
С ksh93
и последние версии bash
:
ts_echo() {
printf '%(%R)T: %s\n' -1 "$*"
}
С zsh
:
ts_echo() print -P %T: "$@"
Или избегать быстрого расширения в "$@"
часть:
ts_echo() echo ${(%):-%T}: "$@"
hacky путь к более старым версиям bash
:
ts_echo() (
PS4="\A"
set -x; : "$@"
)
На самом деле, если точка должна сделать:
echo "<timestamp>: doing cmd args..."
cmd args...
Вы могли сделать:
ts() (
PS4='\A: doing '
set -x; "$@"
)
ts cmd args...
Или постараться не разветвлять оболочку sub:
ts() {
local PS4='\A: doing ' ret
set -x; "$@"
{ ret=$?; set +x; } 2> /dev/null
return "$ret"
}
Затем:
$ ts echo whatever
14:32: doing echo whatever
whatever
(обратите внимание, что они отражены на stderr, который на самом деле может быть предпочтительным).
Когда я делаю вещи как это, я обычно хочу, чтобы все строки (включая любой вывод программы) были добавлены метку времени. Таким образом я использовал бы что-то вроде этого:
#!/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.
ts
команда, которая является частью moreutils. Это - подобный сценарий жемчуга, но с различными вариантами для формата метки времени, и т.д.
– derobert
29.08.2013, 18:18
ts
? Кажется, что это был бы наилучший вариант здесь.
– slm♦
30.08.2013, 18:29
Создание меток времени с ts
установите инструмент ts
(часть пакета moreutils)
:
sudo apt-get install moreutils
Добавление метки времени к выводу:
echo "foo" | ts
вывод:
Sep 03 14:51:44 foo
echo_time
сделает то, что Вы ожидаете, пока Ваше сообщение не имеет a%
войдите в систему он. Не очень надежное решение. – derobert 29.08.2013, 18:17echo_time
мог просто использовать конструкцию date+echo OP – Izkata 29.08.2013, 20:16