답변:
왜 필요한지 잘 모르겠습니다. beep
원하는 것이 스톱워치라면 다음과 같이 할 수 있습니다.
while true; do echo -ne "`date`\r"; done
그것은 당신에게 실시간으로 지나가는 초를 보여줄 것이고 당신은 Ctrl+로 그것을 멈출 수 있습니다 C. 더 높은 정밀도가 필요한 경우이를 사용하여 나노초를 제공 할 수 있습니다.
while true; do echo -ne "`date +%H:%M:%S:%N`\r"; done
마지막으로, 모든 것이 0에서 시작하여 커지기 시작하는 "스톱워치 형식"을 원한다면 다음과 같이 할 수 있습니다.
date1=`date +%s`; while true; do
echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r";
done
카운트 다운 타이머 (원래 질문에서 요청한 것이 아님)의 경우 다음을 수행 할 수 있습니다 (초를 적절히 변경)
seconds=20; date1=$((`date +%s` + $seconds));
while [ "$date1" -ge `date +%s` ]; do
echo -ne "$(date -u --date @$(($date1 - `date +%s` )) +%H:%M:%S)\r";
done
bash (또는 원하는 쉘) 함수를 사용하여 이들을 간단한 명령으로 결합 할 수 있습니다. bash에서 다음 행을 추가하십시오 ~/.bashrc
( sleep 0.1
시스템이 각 실행 사이에 1/10 초 동안 대기하여 CPU를 스팸하지 않도록하십시오).
function countdown(){
date1=$((`date +%s` + $1));
while [ "$date1" -ge `date +%s` ]; do
echo -ne "$(date -u --date @$(($date1 - `date +%s`)) +%H:%M:%S)\r";
sleep 0.1
done
}
function stopwatch(){
date1=`date +%s`;
while true; do
echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r";
sleep 0.1
done
}
그런 다음 다음을 실행하여 1 분의 카운트 다운 타이머를 시작할 수 있습니다.
countdown 60
다음을 사용하여 2 시간 동안 카운트 다운 할 수 있습니다.
countdown $((2*60*60))
또는 하루 종일 다음을 사용합니다.
countdown $((24*60*60))
다음을 실행하여 스톱워치를 시작하십시오.
stopwatch
일, 시간, 분 및 초를 처리 할 수 있어야하는 경우 다음과 같이 할 수 있습니다.
countdown(){
date1=$((`date +%s` + $1));
while [ "$date1" -ge `date +%s` ]; do
## Is this more than 24h away?
days=$(($(($(( $date1 - $(date +%s))) * 1 ))/86400))
echo -ne "$days day(s) and $(date -u --date @$(($date1 - `date +%s`)) +%H:%M:%S)\r";
sleep 0.1
done
}
stopwatch(){
date1=`date +%s`;
while true; do
days=$(( $(($(date +%s) - date1)) / 86400 ))
echo -ne "$days day(s) and $(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r";
sleep 0.1
done
}
점을 유의 stopwatch
내가 정말 24 시간을 기다려야하고 싶지 않았기 때문에 함수가 일 동안 테스트되지 않았습니다. 작동하지만 작동하지 않는 경우 알려주십시오.
bash
(비록 내가 그와 함께 살 수 있습니다 내가 기대하고 나 또한 내 자신의 .bashrc에 잠을 추가 한보다 높은).
date +%s
-$ date1)) + % H : % M : % S) ";
echo -ne "$(date -ju -f %s $(($date1 -
date + % s )) +%H:%M:%S)\r"
;
내가 가장 좋아하는 방법은 다음과 같습니다.
스타트:
time cat
중지:
ctrl+c
@wjandrea가 아래에 언급했듯이 다른 버전이 실행됩니다.
time read
을 눌러 Enter
중지
time read
time read
zsh에서는 실패하지만 time (read)
작동합니다.
나는 똑같은 것을 찾고 있었고 파이썬에서 더 정교한 것을 작성했다.
간단한 10 초 카운트 다운이 제공됩니다.
sudo pip install termdown
termdown 10
나는 이것을 사용했다 :
countdown()
(
IFS=:
set -- $*
secs=$(( ${1#0} * 3600 + ${2#0} * 60 + ${3#0} ))
while [ $secs -gt 0 ]
do
sleep 1 &
printf "\r%02d:%02d:%02d" $((secs/3600)) $(( (secs/60)%60)) $((secs%60))
secs=$(( $secs - 1 ))
wait
done
echo
)
예:
countdown "00:07:55"
여기 소스가 있습니다.
이것은 100 분의 1 초의 스톱워치입니다.
#!/usr/bin/awk -f
function z() {
getline < "/proc/uptime"
close("/proc/uptime")
return $0
}
BEGIN {
x = z()
while (1) {
y = z()
printf "%02d:%05.2f\r", (y - x) / 60, (y - x) % 60
}
}
return $1
나는 아주 좋은 terdon의 답변을 시작부터 시간과 끝까지 시간을 표시하는 기능으로 결합했습니다. 또한 세 가지 변형이 있으므로 호출하기가 쉽고 (bash 수학을 수행 할 필요가 없음) 추상화되어 있습니다. 사용 예 :
{ ~ } » time_minutes 15
Counting to 15 minutes
Start at 11:55:34 Will finish at 12:10:34
Since start: 00:00:08 Till end: 00:14:51
그리고 작업 타이머와 같은 것 :
{ ~ } » time_hours 8
Counting to 8 hours
Start at 11:59:35 Will finish at 19:59:35
Since start: 00:32:41 Till end: 07:27:19
매우 구체적인 시간이 필요한 경우 :
{ ~ } » time_flexible 3:23:00
Counting to 3:23:00 hours
Start at 12:35:11 Will finish at 15:58:11
Since start: 00:00:14 Till end: 03:22:46
.bashrc에 넣을 코드는 다음과 같습니다 .
function time_func()
{
date2=$((`date +%s` + $1));
date1=`date +%s`;
date_finish="$(date --date @$(($date2)) +%T )"
echo "Start at `date +%T` Will finish at $date_finish"
while [ "$date2" -ne `date +%s` ]; do
echo -ne " Since start: $(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S) Till end: $(date -u --date @$(($date2 - `date +%s`)) +%H:%M:%S)\r";
sleep 1
done
printf "\nTimer finished!\n"
play_sound ~/finished.wav
}
function time_seconds()
{
echo "Counting to $1 seconds"
time_func $1
}
function time_minutes()
{
echo "Counting to $1 minutes"
time_func $1*60
}
function time_hours()
{
echo "Counting to $1 hours"
time_func $1*60*60
}
function time_flexible() # accepts flexible input hh:mm:ss
{
echo "Counting to $1"
secs=$(time2seconds $1)
time_func $secs
}
function play_sound() # adjust to your system
{
cat $1 > /dev/dsp
}
function time2seconds() # changes hh:mm:ss to seconds, found on some other stack answer
{
a=( ${1//:/ })
echo $((${a[0]}*3600+${a[1]}*60+${a[2]}))
}
이것을 리눅스 터미널 ( 리눅스 커맨드 라인을 통해 mp3 또는 wav 파일 재생 ) 또는 cygwin ( babun / win7에서 나를 위해 작동 ) 에서 사운드 를 재생 하는 방법과 결합하면 알람 이있는 간단한 유연한 타이머가 있습니다 !cat /path/foo.wav > /dev/dsp
다른 접근법
countdown=60 now=$(date +%s) watch -tpn1 echo '$((now-$(date +%s)+countdown))'
Mac의 경우 :
countdown=60 now=$(date +%s) watch -tn1 echo '$((now-$(date +%s)+countdown))'
#no p option on mac for watch
만약 0에 도달했을 때 신호를 원한다면, 예를 들어 0이 아닌 종료 상태를 0으로 리턴 한 명령으로 신호를 만들 watch -b
거나 그것을 또는 다른 것과 결합 할 수 있지만,보다 정교한 스크립트를 만들고 싶다면, 아마도 갈 길이 아닙니다. "빠르고 더러운 원 라이너"타입 솔루션에 가깝습니다.
나는 watch
일반적으로 프로그램을 좋아한다 . 나는 이미 while sleep 5; do
다른 효과에 대한 수많은 루프를 작성한 후에 그것을 보았습니다 . watch
명백히 더 좋았습니다.
나는 내 자신의 쉘 스크립트를 작성했다 : github gist
#!/bin/sh
# script to create timer in terminal
# Jason Atwood
# 2013/6/22
# start up
echo "starting timer script ..."
sleep 1 # seconds
# get input from user
read -p "Timer for how many minutes?" -e DURATION
DURATION=$(( $DURATION*60 )) # convert minutes to seconds
# get start time
START=$(date +%s)
# infinite loop
while [ -1 ]; do
clear # clear window
# do math
NOW=$(date +%s) # get time now in seconds
DIF=$(( $NOW-$START )) # compute diff in seconds
ELAPSE=$(( $DURATION-$DIF )) # compute elapsed time in seconds
MINS=$(( $ELAPSE/60 )) # convert to minutes... (dumps remainder from division)
SECS=$(( $ELAPSE - ($MINS*60) )) # ... and seconds
# conditional
if [ $MINS == 0 ] && [ $SECS == 0 ] # if mins = 0 and secs = 0 (i.e. if time expired)
then # blink screen
for i in `seq 1 180`; # for i = 1:180 (i.e. 180 seconds)
do
clear # flash on
setterm -term linux -back red -fore white # use setterm to change background color
echo "00:00 " # extra tabs for visibiltiy
sleep 0.5
clear # flash off
setterm -term linux -default # clear setterm changes from above
echo "00:00" # (i.e. go back to white text on black background)
sleep 0.5
done # end for loop
break # end script
else # else, time is not expired
echo "$MINS:$SECS" # display time
sleep 1 # sleep 1 second
fi # end if
done # end while loop
아무도 sleepenh
그들의 스크립트 에서 도구를 사용하지 않은 것에 놀랐습니다 . 대신 제안 된 솔루션 sleep 1
은 후속 타이머 출력 또는 가능한 한 빨리 출력하는 사용 중 루프 사이 를 사용 합니다. 전자는 인쇄에 소요되는 시간이 짧기 때문에 출력이 실제로 초당 1 회 발생하지 않지만 최적이 아닌 출력보다 약간 적기 때문에 부적절합니다. 충분한 시간이 지나면 카운터는 1 초를 건너 뜁니다. 후자는 CPU를 아무 이유없이 바쁘게 유지하기 때문에 부적절합니다.
내가 가진 도구는 $PATH
다음과 같습니다.
#!/bin/sh
if [ $# -eq 0 ]; then
TIMESTAMP=$(sleepenh 0)
before=$(date +%s)
while true; do
diff=$(($(date +%s) - before))
printf "%02d:%02d:%02d\r" $((diff/3600)) $(((diff%3600)/60)) $((diff%60))
TIMESTAMP=$(sleepenh $TIMESTAMP 1.0);
done
exit 1 # this should never be reached
fi
echo "counting up to $@"
"$0" &
counterpid=$!
trap "exit" INT TERM
trap "kill 0" EXIT
sleep "$@"
kill $counterpid
스크립트는 스톱워치 (중단 될 때까지 카운트 업) 또는 지정된 시간 동안 실행되는 타이머로 사용될 수 있습니다. 때문에 sleep
명령이 사용되며,이 스크립트는이 같은 정밀도로 계산하기위한 기간을 지정할 수 있습니다 sleep
할 수 있습니다. 데비안과 파생물에는 초 미만의 수면과 시간을 지정하는 사람이 읽을 수있는 좋은 방법이 포함됩니다. 예를 들어 다음과 같이 말할 수 있습니다.
$ time countdown 2m 4.6s
countdown 2m 4.6s 0.00s user 0.00s system 0% cpu 2:04.60 total
보시다시피, 명령은 스크립트 자체에 많은 마술없이 2 분 4.6 초 동안 정확하게 실행되었습니다.
편집 :
sleepenh 도구는 데비안에 같은 이름의 패키지와 우분투와 같은 파생물에서 비롯됩니다. 없는 배포의 경우 https://github.com/nsc-deb/sleepenh 에서 제공됩니다.
sleepenh의 장점은 루프 동안 수면 이외의 다른 것들을 처리하여 시간이 지남에 따라 발생하는 작은 지연을 고려할 수 있다는 것입니다. 하나는 것입니다 경우에도 sleep 1
루프의 10 배에, 전체 실행은 조금에게 있기 때문에 실행에서 오는 작은 오버 헤드를 10 초 이상 걸릴 sleep
루프를 반복합니다. 이 오류는 천천히 누적되며 시간이 지남에 따라 스톱워치 타이머가 점점 부정확 해집니다. 이 문제를 해결하려면 각 루프 반복마다 정확한 잠자기 시간을 계산해야하며, 이는 일반적으로 1 초보다 약간 작은 시간입니다 (1 초 간격 타이머의 경우). sleepenh 도구가이를 수행합니다.
sleep 0.1
. 무엇입니까 sleepnh
(아치 저장소에서 찾을 수 없음)와 어떻게 다릅니 sleep
까? 내가 알 수있는 한, 당신은 기본적으로 위의 대답과 같은 일을하고 있습니다. 내가 무엇을 놓치고 있습니까?
sleep 5
는 정확히 5 초 동안 잠을 자지 않는다는 것입니다. 예를 들어 time sleep 5
보면 명령 실행에 5 초 이상이 걸린다는 것을 알 수 있습니다. 시간이 지남에 따라 오류가 누적됩니다. sleepenh 유틸리티를 사용하면 이러한 오류 누적을 쉽게 피할 수 있습니다.
sleepnh
보다 낫다 sleep
당신은 단지 다른 답변이 사용하는 말 ( sleep 1
그렇지 않은 - 어떤 , OP 만 해당 도구 및 ii) 표준 도구가 아니므로 설치 위치 및 설치 방법을 사용합니다.
sleep
과 의 차이점을 설명했습니다 sleepenh
. 어쨌든, 아마 그것에 대해 충분히 명확하지 않았기 때문에 결국에는 더 확장했습니다. 밀리 초 정확도 문제는 sleep
한 번만 호출하면 얻을 수있는 문제입니다 . 그들은 시간이 지남에 따라 축적되며 어느 시점에서 눈에 띄게 나타납니다. 나는 다른 사람들 만 사용한다고 말하지 않았다 sleep 1
. 나는 그들이 사용 sleep 1
하거나 busyloop를 말했다. 그들은 여전히 그렇습니다. 반대의 예를 보여주세요. 답변은 오류를 훨씬 더 빨리 누적한다는 점 sleep 0.1
을 sleep 1
제외하고 는 답변 과 동일 합니다.
짧은 답변:
for i in `seq 60 -1 1` ; do echo -ne "\r$i " ; sleep 1 ; done
설명:
나는 많은 답변이 있다는 것을 알고 있지만 OP의 질문에 매우 가까운 것을 게시하고 싶습니다. 개인적으로 실제로 " 터미널의 oneliner countdown "으로 받아들 입니다. 내 목표는 다음과 같습니다.
작동 방식 :
seq
60에서 1까지의 숫자를 인쇄합니다.echo -ne "\r$i "
캐럿을 문자열의 시작 부분으로 되돌리고 현재 $i
값을 인쇄 합니다. 현재 $i
(10-> 9) 보다 문자 수만큼 길면 이전 값을 덮어 써야합니다 .OSX에서 커맨드 라인 스톱워치를 찾는 사람이라고 가정하십시오. GNU 도구를 설치하지 않고 유닉스와 함께 실행하고 싶은 척하십시오.date
이 경우 @terdon이 말하지만이 수정으로 수행하십시오.
function stopwatch(){
date1=`date +%s`;
while true; do
echo -ne "$(date -jf "%s" $((`date +%s` - $date1)) +%H:%M:%S)\r";
sleep 0.1
done
}
시계 + 날짜를 UTC 시간으로 사용하십시오. 큰 디스플레이를 위해 패키지를 설치할 수도 있습니다 ...
export now="`date +%s -u`";
watch -n 0,1 'date +%T -u -d @$((`date +%s` - $now ))'
#Big plain characters
watch -n 0,1 'date +%T -u -d @$((`date +%s` - $now )) | toilet -f mono12'
#Big empty charaters
watch -n 0,1 'date +%T -u -d @$((`date +%s` - $now )) | figlet -c -f big'
시도 해봐!
http://www.cyberciti.biz/faq/create-large-colorful-text-banner-on-screen/ 도 참조하십시오
sw 는 영원히 실행되는 간단한 스톱워치입니다.
wget -q -O - http://git.io/sinister | sh -s -- -u https://raw.githubusercontent.com/coryfklein/sw/master/sw
sw
- start a stopwatch from 0, save start time in ~/.sw
sw [-r|--resume]
- start a stopwatch from the last saved start time (or current time if no last saved start time exists)
- "-r" stands for --resume
파이썬 예제 :
#!/usr/bin/python
def stopwatch ( atom = .01 ):
import time, sys, math
start = time.time()
last = start
sleep = atom/2
fmt = "\r%%.%sfs" % (int(abs(round(math.log(atom,10)))) if atom<1 else "")
while True:
curr = time.time()
subatom = (curr-last)
if subatom>atom:
# sys.stdout.write( "\r%.2fs" % (curr-start))
sys.stdout.write( fmt % (curr-start))
sys.stdout.flush()
last = curr
else:
time.sleep(atom-subatom)
stopwatch()
이것은 허용되는 답변과 비슷하지만 terdon의 countdown()
구문 오류가 발생했습니다. 그러나 이것은 나를 위해 훌륭하게 작동합니다.
function timer() { case "$1" in -s) shift;; *) set $(($1 * 60));; esac; local S=" "; for i in $(seq "$1" -1 1); do echo -ne "$S\r $i\r"; sleep 1; done; echo -e "$S\rTime's up!"; }
그것을 넣고 .bashrc
다음과 같이 실행할 수 있습니다 timer t
(여기서 t는 시간입니다).
워크샵의 대형 카운트 다운 타이머를 표시하는 용어 애플리케이션을 찾을 때 오늘이 질문을 발견했습니다. 제안 사항 중 정확히 필요한 것은 없었으므로 Go에서 다른 제안을 신속하게 정리했습니다. https://github.com/bnaucler/cdown
문제가 이미 충분히 대답되었으므로 후손을위한 것으로 생각하십시오.
수면 1500 및 xterm -fg 노랑 -g 240x80 &
노란색 문자가있는 큰 터미널이 올라 오면 일어나서 스트레칭 할 시간입니다!
참고 :-1500 초 = 25 분 포모 도로-240x80 = 터미널 크기는 240 자, 80 행입니다. 화면이 눈에 띄게 채워집니다.
크레딧 : http://www.linuxquestions.org/questions/linux-newbie-8/countdown-timer-for-linux-949463/
어떤 이유로 든 컴파일 가능한 프로그램을 원하면 다음과 같이 작동합니다.
#include <iostream>
#include <string>
#include <chrono>
int timer(seconds count) {
auto t1 = high_resolution_clock::now();
auto t2 = t1+count;
while ( t2 > high_resolution_clock::now()) {
std::cout << "Seconds Left:" <<
std::endl <<
duration_cast<duration<double>>(count-(high_resolution_clock::now()-t1)).count() <<
std::endl << "\033[2A\033[K";
std::this_thread::sleep_for(milliseconds(100));
}
std::cout << "Finished" << std::endl;
return 0;
}
bash 환경을 사용할 수 없거나 컴파일 된 프로그램을 선호하는 경우 다른 프로그램에서도 쉽게 이식 할 수 있습니다
.zshrc
당신의 대답을 읽은 후에이 멋진 기능들을 오른쪽에 추가 했습니다. 오늘countdown
은 처음으로 사용 했으며 CPU 사용량이 다소 높았습니다. 나는sleep 0.1
(모든 시스템에서 수초의 수면 시간이 지원되는지 모르겠다) 추가하여 크게 향상시켰다. 단점은 물론 정확도가 떨어질 수 있지만 최대 편차로 살 수 있습니다. 100ms.