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
답변
를 생략 echo
하고 date
명령에 메시지를 넣을 수 있습니다. date
형식 문자열에 텍스트를 삽입 할 수 있습니다 ( +%R
예제에서). 예를 들면 다음과 같습니다.
date +"%R usb device already mounted"
편의를 위해 쉘 함수에 넣을 수도 있습니다. 예를 들면 다음과 같습니다.
echo_time() {
date +"%R $*"
}
echo_time "usb device already mounted"
여러 번 재사용하려는 경우 더 깨끗합니다.
답변
보다 강력하고 이식 가능한 (POSIX) 방법, 특히 %
인수로 처리되지 않은 상태를 유지할 수있는 방법이 있습니다 .
echo_time() {
date +"%H:%M $(printf "%s " "$@" | sed 's/%/%%/g')"
}
답변
다음에 대한 변수를 만들 수 있습니다 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
답변
와 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에 에코되어 실제로 바람직 할 수 있습니다).
답변
이와 같은 작업을 할 때 일반적으로 모든 줄 (프로그램 출력 포함)에 타임 스탬프를 붙이고 싶습니다. 따라서 다음과 같은 것을 사용합니다.
#!/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
도구 설치 ts
(패키지 일부 moreutils)
:
sudo apt-get install moreutils
출력에 타임 스탬프 추가 :
echo "foo" | ts
산출:
Sep 03 14:51:44 foo
답변
alias echo="d=$(date +%Y-%m-%d); echo $d "
echo hola