에코 전 타임 스탬프


12

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

답변:


22

를 생략 echo하고 date명령에 메시지를 넣을 수 있습니다. date형식 문자열에 텍스트를 삽입 할 수 있습니다 ( +%R예제에서). 예를 들면 다음과 같습니다.

date +"%R usb device already mounted"

편의를 위해 쉘 함수에 넣을 수도 있습니다. 예를 들면 다음과 같습니다.

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

echo_time "usb device already mounted"

여러 번 재사용하려는 경우 더 깨끗합니다.


6
echo_time메시지에 %서명이있을 때까지 원하는대로 수행 합니다. 매우 강력한 솔루션은 아닙니다.
derobert

1
@derobert 구현이 함수에 숨겨져 있기 때문에 echo_timeOP의 날짜 + 에코 구문을 사용할 수 있습니다
Izkata

난 그냥 "$ @"( "나중에 사용 습관을 얻기 위해")에 의해 "$ *"를 변경합니다
Olivier Dulac

파이프에서 어떻게 사용합니까?
erikbwork

6

보다 강력하고 이식 가능한 (POSIX) 방법, 특히 %인수로 처리되지 않은 상태를 유지할 수있는 방법이 있습니다 .

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

5

다음에 대한 변수를 만들 수 있습니다 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

3
이것은 세 번이 아니라 한 번만 전화하기 때문에 좋습니다.
evilsoup

2
스크립트가 오래 지속되지 않을 때는 좋지만 더 길면 날짜가 잘못됩니다.
TaXXoR

4

ksh93최신 버전 bash:

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

zsh:

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

또는 "$@"부품의 신속한 확장을 피하려면 :

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

이전 버전의 해킹 방법 bash:

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

실제로, 요점은 다음과 같습니다.

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

당신은 할 수 있습니다 :

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

또는 서브 쉘을 포크하지 않으려면 :

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에 에코되어 실제로 바람직 할 수 있습니다).


1

이와 같은 작업을 할 때 일반적으로 모든 줄 (프로그램 출력 포함)에 타임 스탬프를 붙이고 싶습니다. 따라서 다음과 같은 것을 사용합니다.

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

그러나 일단 출력이 파이프로 이동하면 응용 프로그램이 출력을 버퍼링하기 시작하므로 타이밍에 인쇄 시간이 반영되지 않을 수 있습니다.
Stéphane Chazelas

2
tsmoreutils의 일부인 명령을 확인하는 것이 좋습니다 . 비슷한 펄 스크립트이지만 타임 스탬프 형식 등에 대한 다양한 옵션이 있습니다.
derobert

@derobert-왜 이것을 사용 ts하는가? 가장 좋은 옵션 인 것 같습니다.
slm

1

로 타임 스탬프 만들기 ts

도구 설치 ts(패키지 일부 moreutils):

sudo apt-get install moreutils

출력에 타임 스탬프 추가 :

echo "foo" | ts

산출:

Sep 03 14:51:44 foo

-1
alias echo="d=$(date +%Y-%m-%d); echo $d "
echo hola

1
방금 시도했을 때 작동하지 않았습니다.
slm

@slm이 쓴 것처럼. 조기 명령 및 변수 확장으로부터 문자열을 보호해야합니다.
manatwork
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.