timestamp antes de um eco

10

Existe uma maneira mais agradável de criar timestamp na frente de um echo ?

Atualmente eu faço assim:

#!/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

A saída deve ser algo assim:

10:36 usb device already mounted
    
por TaXXoR 29.08.2013 / 11:03

7 respostas

19

Você pode pular o echo e apenas colocar a mensagem no comando date . date permite que você insira texto na string de formato ( +%R em seu exemplo). Por exemplo:

date +"%R usb device already mounted"

Você também pode jogá-lo em uma função shell por conveniência. Por exemplo:

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

echo_time "usb device already mounted"

Este é um produto de limpeza se você for reutilizá-lo muitas vezes.

    
por 29.08.2013 / 11:15
5

Você pode criar uma variável para 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
    
por 29.08.2013 / 11:40
5

Aqui está uma maneira mais robusta e portátil (POSIX) de fazê-lo, particularmente uma que permite que % permaneça não processado como um argumento:

echo_time() {
    date +"%H:%M $(printf "%s " "$@" | sed 's/%/%%/g')"
}
    
por 29.08.2013 / 12:32
4

Com ksh93 e versões recentes de bash :

ts_echo() {
  printf '%(%R)T: %s\n' -1 "$*"
}

com zsh :

ts_echo() print -P %T: "$@"

Ou para evitar a rápida expansão na parte "$@" :

ts_echo() echo ${(%):-%T}: "$@"

Um caminho hacky para versões mais antigas de bash :

ts_echo() (
  PS4="\A"
  set -x; : "$@"
)

Na verdade, se o objetivo é fazer:

echo "<timestamp>: doing cmd args..."
cmd args...

Você poderia fazer:

ts() (
  PS4='\A: doing '
  set -x; "$@"
)
ts cmd args...

Ou para evitar o bifurcação de um sub shell:

ts() {
  local PS4='\A: doing ' ret
  set -x; "$@"
  { ret=$?; set +x; } 2> /dev/null
  return "$ret"
}

Então:

$ ts echo whatever
14:32: doing echo whatever
whatever

(note que eles são ecoados no stderr, o que na verdade pode ser preferível).

    
por 29.08.2013 / 14:06
1

Quando faço coisas como essa, geralmente quero que todas as linhas (incluindo qualquer saída do programa) tenham registro de data e hora. Assim, eu usaria algo assim:

#!/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()."] $_"'

Como Stephane aponta abaixo, programas individuais podem armazenar em buffer sua saída quando enviados para um pipe. Naturalmente, esses buffers serão liberados quando o programa sair, de modo que, na pior das hipóteses, os timestamps serão exibidos quando o programa sair (se ele armazenar em buffer sua saída e não imprimir o suficiente para preencher o buffer). No entanto, os timestamps echo serão todos precisos.

Como uma amostra executável para teste:

#!/bin/sh

(
    echo "Doing something"
    sleep 5
    echo "Doing something else..."
    ls /some/file
    sleep 8
    echo "Done."
) 2>&1 | perl -ne 'print "[".localtime()."] $_"'

Saída:

[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.
    
por 29.08.2013 / 13:40
1

Criando timestamps com ts

instale a ferramenta ts (parte do pacote moreutils) :

sudo apt-get install moreutils

Adicionando um registro de data e hora a uma saída:

echo "foo" | ts

saída:

Sep 03 14:51:44 foo
    
por 03.09.2013 / 14:52
-1
alias echo="d=$(date +%Y-%m-%d); echo $d "
echo hola
    
por 29.08.2013 / 22:29