метка времени перед эхом

В настоящее время VirtualBox является бесплатным для персонального использования - включая профессиональное персональное использование. Последний изменился (на включение профессионального персонального использования) когда Oracle aquired Sun. Это может возвратить любое время.

Microsoft Virtual PC все еще свободна - но я не уверен, работает ли она на Windows 7 или выше.

OpenSource является Linux-KVM. Едва ли OpenSource (просто некоторые Версии) является XEN. Самые свободные дистрибутивы Linux OpenSource теперь включают KVM (например, Ubuntu LTS).

11
29.08.2013, 13:25
7 ответов

Вы могли пропустить echo, и просто вставленный в сообщение date команда. date позволяет Вам вставлять текст в строку формата (+%R в Вашем примере). Например:

date +"%R usb device already mounted"

Можно также бросить его в функцию оболочки для удобства. Например:

echo_time() {
    date +"%R $*"
}

echo_time "usb device already mounted"

Это - инструмент для очистки, если Вы собираетесь снова использовать его много раз.

20
27.01.2020, 19:56
  • 1
    echo_time сделает то, что Вы ожидаете, пока Ваше сообщение не имеет a % войдите в систему он. Не очень надежное решение. –  derobert 29.08.2013, 18:17
  • 2
    @derobert, поскольку реализация скрыта в функции, echo_time мог просто использовать конструкцию date+echo OP –  Izkata 29.08.2013, 20:16
  • 3
    я просто изменил бы "$*" на "$" (чтобы привыкнуть использовать позже) –  Olivier Dulac 29.08.2013, 20:19
  • 4
    , как использовать это в канале? –  erikbwork 08.01.2016, 21:05

Можно создать переменную для 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
5
27.01.2020, 19:56
  • 1
    Это хорошо, потому что это только называет дату однажды, а не три раза. –  evilsoup 29.08.2013, 12:48
  • 2
    Это хорошо, когда сценарий не продлится долго, но он будет иметь неправильную дату, когда это будет длиннее. –  TaXXoR 30.08.2013, 08:39

Вот более устойчивое и портативное (POSIX) способ сделать это, особенно то, которое допускает % остаться необработанным как аргумент:

echo_time() {
    date +"%H:%M $(printf "%s " "$@" | sed 's/%/%%/g')"
}
6
27.01.2020, 19:56

С 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, который на самом деле может быть предпочтительным).

4
27.01.2020, 19:56

Когда я делаю вещи как это, я обычно хочу, чтобы все строки (включая любой вывод программы) были добавлены метку времени. Таким образом я использовал бы что-то вроде этого:

#!/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.
1
27.01.2020, 19:56
  • 1
    Однако обратите внимание, что, после того как вывод идет в канал, приложения начинают буферизовать свой вывод, таким образом, синхронизации не могут отразить время, они были распечатаны. –  Stéphane Chazelas 29.08.2013, 15:08
  • 2
    я предлагаю проверить ts команда, которая является частью moreutils. Это - подобный сценарий жемчуга, но с различными вариантами для формата метки времени, и т.д. –  derobert 29.08.2013, 18:18
  • 3
    @derobert - почему Вы не описываете, как сделать это использование ts? Кажется, что это был бы наилучший вариант здесь. –  slm♦ 30.08.2013, 18:29
alias echo="d=$(date +%Y-%m-%d); echo $d "
echo hola
-1
27.01.2020, 19:56
  • 1
    Это не работало, когда я просто попробовал его. –  slm♦ 29.08.2013, 23:47
  • 2
    Так же, как @slm записал. Необходимо защитить строку от преждевременной команды и переменных расширений. –  manatwork 30.08.2013, 18:06

Создание меток времени с ts

установите инструмент ts (часть пакета moreutils):

sudo apt-get install moreutils

Добавление метки времени к выводу:

echo "foo" | ts

вывод:

Sep 03 14:51:44 foo
1
27.01.2020, 19:56

Теги

Похожие вопросы