Câu trả lời:
Tôi không chắc tại sao bạn cần beep
, nếu tất cả những gì bạn muốn là một chiếc đồng hồ bấm giờ, bạn có thể làm điều này:
while true; do echo -ne "`date`\r"; done
Điều đó sẽ cho bạn thấy những giây trôi qua trong thời gian thực và bạn có thể dừng nó với Ctrl+ C. Nếu bạn cần độ chính xác cao hơn, bạn có thể sử dụng điều này để cung cấp cho bạn nano giây:
while true; do echo -ne "`date +%H:%M:%S:%N`\r"; done
Cuối cùng, nếu bạn thực sự, thực sự muốn "định dạng đồng hồ bấm giờ", trong đó mọi thứ bắt đầu từ 0 và bắt đầu phát triển, bạn có thể làm một cái gì đó như thế này:
date1=`date +%s`; while true; do
echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r";
done
Đối với đồng hồ đếm ngược (không phải là câu hỏi ban đầu của bạn yêu cầu), bạn có thể làm điều này (thay đổi giây tương ứng):
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
Bạn có thể kết hợp chúng thành các lệnh đơn giản bằng cách sử dụng các hàm bash (hoặc bất kỳ shell nào bạn thích). Trong bash, hãy thêm các dòng này vào ~/.bashrc
(dòng sleep 0.1
sẽ khiến hệ thống chờ 1/10 giây giữa mỗi lần chạy để bạn không spam CPU của mình):
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
}
Sau đó, bạn có thể bắt đầu đồng hồ đếm ngược trong một phút bằng cách chạy:
countdown 60
Bạn có thể đếm ngược hai giờ với:
countdown $((2*60*60))
hoặc cả ngày sử dụng:
countdown $((24*60*60))
Và khởi động đồng hồ bấm giờ bằng cách chạy:
stopwatch
Nếu bạn cần có khả năng xử lý các ngày cũng như giờ, phút và giây, bạn có thể làm một việc như thế này:
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
}
Lưu ý rằng stopwatch
chức năng đã không được thử nghiệm trong nhiều ngày vì tôi không thực sự muốn đợi 24 giờ cho nó. Nó sẽ hoạt động nhưng xin vui lòng cho tôi biết nếu nó không.
bash
, tôi có thể sống với điều đó (mặc dù nó là cao hơn tôi mong đợi và tôi cũng đã thêm giấc ngủ để .bashrc của riêng tôi).
date +%s
- $ date1)) +% H:% M:% S) ";
echo -ne "$(date -ju -f %s $(($date1 -
ngày +% s )) +%H:%M:%S)\r"
;
Cách yêu thích của tôi là:
Khởi đầu:
time cat
Dừng lại:
ctrl+c
Như @wjandrea đã nhận xét bên dưới, một phiên bản khác sẽ chạy:
time read
và nhấn Enter
để dừng lại
time read
time read
thất bại trong zsh, nhưng time (read)
hoạt động.
Tôi đã tìm kiếm điều tương tự và cuối cùng đã viết một cái gì đó phức tạp hơn trong Python:
Điều này sẽ cung cấp cho bạn đếm ngược 10 giây đơn giản:
sudo pip install termdown
termdown 10
Tôi đã sử dụng cái này:
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
)
Thí dụ:
countdown "00:07:55"
Đây là một nguồn .
sh-3.2# man leave
đặt hẹn giờ trong 15 phút
sh-3.2# leave +0015
Alarm set for Thu Nov 3 14:19:31 CDT 2016. (pid 94317)
sh-3.2#
chỉnh sửa: Tôi đã có một loạt các liên kết mở, và tôi nghĩ rằng điều này là cụ thể cho osx, xin lỗi về điều đó. Để lại câu trả lời của tôi để những người khác biết về việc rời khỏi BSD.
Đây là một chiếc đồng hồ bấm giờ với một phần trăm giây:
#!/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
Tôi đã kết hợp câu trả lời của terdon rất tốt, vào chức năng đồng thời hiển thị thời gian kể từ khi bắt đầu và thời gian cho đến khi kết thúc. Ngoài ra còn có ba biến thể để dễ gọi hơn (bạn không phải làm bash math) và nó cũng được trừu tượng hóa. Ví dụ sử dụng :
{ ~ } » 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
Và một cái gì đó như bộ đếm thời gian làm việc:
{ ~ } » 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
Và nếu bạn cần một thời gian rất cụ thể:
{ ~ } » 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
Đây là mã để đưa vào .bashrc của bạn
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]}))
}
Kết hợp điều này với một số cách phát âm thanh trong thiết bị đầu cuối linux ( phát tệp mp3 hoặc wav qua dòng lệnh Linux ) hoặc cygwin ( cat /path/foo.wav > /dev/dsp
hoạt động với tôi trong babun / win7) và bạn có bộ hẹn giờ linh hoạt đơn giản với báo thức !
Cách tiếp cận khác
countdown=60 now=$(date +%s) watch -tpn1 echo '$((now-$(date +%s)+countdown))'
Đối với máy Mac:
countdown=60 now=$(date +%s) watch -tn1 echo '$((now-$(date +%s)+countdown))'
#no p option on mac for watch
Nếu người ta muốn có tín hiệu khi nó về 0, ví dụ, người ta có thể xây dựng nó bằng một lệnh trả về trạng thái thoát khác không ở mức 0 và kết hợp nó với watch -b
, hoặc một cái gì đó, nhưng nếu người ta muốn xây dựng một kịch bản phức tạp hơn, thì đây có lẽ là không phải là con đường để đi; nó là một giải pháp loại "nhanh và bẩn".
Tôi thích watch
chương trình nói chung. Lần đầu tiên tôi nhìn thấy nó sau khi tôi đã viết vô số while sleep 5; do
vòng lặp cho các hiệu ứng khác nhau. watch
đã đẹp hơn
Cuối cùng tôi đã viết kịch bản shell của riêng mình: 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
Tôi ngạc nhiên khi không ai sử dụng sleepenh
công cụ này trong các tập lệnh của họ. Thay vào đó, các giải pháp được đề xuất sử dụng sleep 1
giữa các đầu ra bộ đếm thời gian tiếp theo hoặc một vòng lặp bận rộn xuất ra càng nhanh càng tốt. Điều này là không đủ bởi vì thời gian nhỏ dành cho việc in ấn, đầu ra sẽ không thực sự xảy ra một lần mỗi giây mà ít hơn một chút so với mức tối ưu. Sau khi đủ thời gian trôi qua, bộ đếm sẽ bỏ qua một giây. Cái sau là không đủ vì nó giữ CPU bận mà không có lý do chính đáng.
Công cụ mà tôi có trong $PATH
ngoại hình của mình như thế này:
#!/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
Kịch bản có thể được sử dụng làm đồng hồ bấm giờ (đếm cho đến khi bị gián đoạn) hoặc như một bộ đếm thời gian chạy trong khoảng thời gian được chỉ định. Vì sleep
lệnh được sử dụng, tập lệnh này cho phép chỉ định thời lượng cần tính chính xác như mức sleep
cho phép của bạn . Trên Debian và các dẫn xuất, điều này bao gồm các giấc ngủ phụ thứ hai và một cách dễ đọc của con người để xác định thời gian. Vì vậy, ví dụ bạn có thể nói:
$ time countdown 2m 4.6s
countdown 2m 4.6s 0.00s user 0.00s system 0% cpu 2:04.60 total
Và như bạn có thể thấy, lệnh chạy chính xác trong 2 phút và 4,6 giây mà không có nhiều phép thuật trong chính kịch bản.
CHỈNH SỬA :
Công cụ ngủenh xuất phát từ gói cùng tên trong Debian và các dẫn xuất của nó như Ubuntu. Đối với các bản phân phối không có nó, nó đến từ https://github.com/nsc-deb/s ngủenh
Ưu điểm của Sleepenh là, nó có thể tính đến sự chậm trễ nhỏ tích lũy theo thời gian từ việc xử lý những thứ khác ngoài giấc ngủ trong một vòng lặp. Ngay cả khi một người chỉ sleep 1
trong một vòng lặp 10 lần, thì việc thực hiện tổng thể sẽ mất hơn 10 giây một chút vì chi phí nhỏ xuất phát từ việc thực hiện sleep
và lặp lại vòng lặp. Lỗi này từ từ tích lũy và theo thời gian sẽ khiến đồng hồ bấm giờ của chúng ta ngày càng thiếu chính xác. Để khắc phục vấn đề này, mỗi lần lặp phải tính toán thời gian chính xác để ngủ thường ít hơn một giây (đối với bộ định thời khoảng một giây). Công cụ ngủenh làm điều này cho bạn.
sleep 0.1
. Cái gì sleepnh
(tôi không thể tìm thấy nó trong Arch repos) và nó khác với sleep
cái gì? Theo như tôi có thể nói, về cơ bản bạn đang làm điều tương tự như câu trả lời của tôi ở trên. Tôi đang thiếu gì?
sleep 5
là, bạn không ngủ đúng 5 giây. Hãy thử ví dụ time sleep 5
và bạn thấy rằng việc chạy lệnh mất hơn 5 giây một chút. Theo thời gian các lỗi tích lũy. Tiện ích ngủenh cho phép dễ dàng tránh sự tích lũy lỗi này.
sleepnh
tốt hơn sleep
(bạn chỉ nói những câu trả lời khác sử dụng cách sleep 1
mà họ không làm , chỉ OP sử dụng điều đó) và ii) nơi để có được nó và cách cài đặt nó vì nó không phải là một công cụ tiêu chuẩn.
sleep
và sleepenh
trong đoạn đầu tiên. Dù sao, tôi có lẽ không đủ rõ ràng về điều đó nên cuối cùng tôi đã mở rộng thêm về điều đó. Các vấn đề chính xác mili giây là những gì bạn nhận được khi gọi sleep
một lần. Chúng tích lũy theo thời gian và tại một số điểm đáng chú ý. Tôi không nói rằng những người khác chỉ sử dụng sleep 1
. Tôi nói rằng họ sử dụng sleep 1
hoặc một busyloop. Mà họ vẫn làm. Chỉ cho tôi một ví dụ truy cập. Câu trả lời sleep 0.1
giống như những câu trả lời sleep 1
ngoại trừ việc chúng tích lũy lỗi thậm chí nhanh hơn.
Câu trả lời ngắn:
for i in `seq 60 -1 1` ; do echo -ne "\r$i " ; sleep 1 ; done
Giải trình:
Tôi biết có rất nhiều câu trả lời, nhưng tôi chỉ muốn đăng một cái gì đó rất gần với câu hỏi của OP, cá nhân tôi sẽ chấp nhận thực sự là " đếm ngược oneliner trong thiết bị đầu cuối ". Mục tiêu của tôi là:
Làm thế nào nó hoạt động:
seq
in số từ 60 đến 1.echo -ne "\r$i "
trả về dấu mũ để bắt đầu chuỗi và in $i
giá trị hiện tại . Không gian sau khi được yêu cầu ghi đè giá trị trước đó, nếu nó dài hơn ký tự so với hiện tại $i
(10 -> 9).Để tham khảo trong tương lai, có một công cụ dòng lệnh gọi làTimTimer với các tùy chọn dòng lệnh rất đơn giản cho đồng hồ đếm ngược / đếm ngược.
Giả vờ bạn là một người trên OSX đang tìm kiếm đồng hồ bấm giờ dòng lệnh. Giả vờ rằng bạn không muốn cài đặt các công cụ gnu và chỉ muốn chạy với unixdate
trong trường hợp đó, hãy làm như @terdon nói nhưng với sửa đổi này:
function stopwatch(){
date1=`date +%s`;
while true; do
echo -ne "$(date -jf "%s" $((`date +%s` - $date1)) +%H:%M:%S)\r";
sleep 0.1
done
}
Đơn giản chỉ cần sử dụng đồng hồ + ngày trong thời gian UTC. Bạn cũng có thể cài đặt một số gói cho màn hình lớn ...
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'
Thử nó!
Xem thêm http://www.cyberciti.biz/faq/create-large-colorful-text-banner-on-screen/
sw là một chiếc đồng hồ bấm giờ đơn giản sẽ chạy mãi mãi.
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
Một ví dụ về con trăn:
#!/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()
Điều này tương tự như câu trả lời được chấp nhận, nhưng terdon countdown()
đã cho tôi lỗi cú pháp. Điều này làm việc rất tốt cho tôi, mặc dù:
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!"; }
Bạn có thể đặt nó vào .bashrc
và sau đó thực hiện với: timer t
(trong đó t là thời gian tính bằng phút).
Tìm thấy câu hỏi này sớm hơn ngày hôm nay, khi tìm kiếm một ứng dụng hạn để hiển thị đồng hồ đếm ngược lớn cho một hội thảo. Không có gợi ý nào là chính xác những gì tôi cần, vì vậy tôi nhanh chóng kết hợp một đề xuất khác trong Go: https://github.com/bnaucler/cdown
Vì câu hỏi đã được trả lời đầy đủ, hãy xem xét điều này là vì lợi ích của hậu thế.
$ ngủ 1500 && xterm -fg vàng -g 240x80 &
Khi thiết bị đầu cuối lớn với văn bản màu vàng nhảy lên, thời gian để đứng dậy và kéo dài!
Lưu ý: - 1500 giây = 25 phút pomodoro - 240x80 = kích thước thiết bị đầu cuối với hàng 240 ký tự và 80 hàng. Lấp đầy một màn hình cho tôi đáng chú ý.
Tín dụng: http://www.linuxquestions.org/questions/linux-newbie-8/countdown-timer-for-linux-949463/
Phiên bản GUI của đồng hồ bấm giờ
date1=`date +%s`
date1_f=`date +%H:%M:%S____%d/%m`
(
while true; do
date2=$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)
echo "# started at $date1_f \n$date2"
done
) |
zenity --progress \
--title="Stop Watch" \
--text="Stop Watch..." \
--percentage=0
Nếu bạn muốn một chương trình có khả năng biên dịch vì bất kỳ lý do gì, những điều sau đây sẽ hoạt động:
#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;
}
Điều này có thể được sử dụng trong các chương trình khác cũng như dễ dàng chuyển, nếu môi trường bash không có sẵn hoặc bạn chỉ thích sử dụng một chương trình được biên dịch
.zshrc
ngay sau khi tôi đọc câu trả lời của bạn. Hôm nay tôi đã sử dụngcountdown
lần đầu tiên và nhận thấy việc sử dụng CPU khá cao. Tôi đã thêm mộtsleep 0.1
(Tôi không biết nếu thời gian ngủ của một phần giây được hỗ trợ trên tất cả các hệ thống) đã cải thiện điều đó rất nhiều. Hạn chế tất nhiên là độ chính xác hiển thị kém chính xác hơn, nhưng tôi có thể sống với độ lệch tối đa. 100ms.