सवाल टर्मिनल में उलटी गिनती या स्टॉपवॉच टाइमर प्रदर्शित करने का कोई तरीका है?


मैं लिनक्स टर्मिनल पर रीयल-टाइम उलटी गिनती टाइमर कैसे प्रदर्शित कर सकता हूं? क्या कोई मौजूदा ऐप है या इससे भी बेहतर, एक लाइनर ऐसा करने के लिए है?


127
2018-06-24 20:13


मूल


एसयू होल्ड के संबंध में: मुझे लगता है कि यह "खरीदारी या उत्पाद की सिफारिश के लिए पूछे बिना" कंप्यूटर सॉफ्टवेयर "के अंतर्गत आता है। मैं सिफारिशों के लिए नहीं पूछ रहा हूँ; मैं पूछ रहा हूं कि कुछ भी मौजूद है या नहीं। जब मैंने शुरुआत में सवाल पूछा, तो मुझे उम्मीद थी कि "हाँ यह अंतर्निहित-स्क्रिप्ट स्क्रिप्ट है"। अगर मैं सवाल को पुन: व्यवस्थित कर सकता हूं, तो मैं करूँगा। - tir38
मैंने यही करने की कोशिश की। जहां तक ​​मेरा संबंध है, मेरे संपादन के बाद यह विषय पर है और मैंने इसे फिर से खोलने के लिए वोट दिया है। - terdon
@terdon धन्यवाद, मैं देखता हूं कि यह एक बेहतर सवाल है। - tir38


जवाब:


मुझे यकीन नहीं है कि आपको क्यों चाहिए beep, यदि आप चाहते हैं कि एक स्टॉपवॉच है, तो आप यह कर सकते हैं:

while true; do echo -ne "`date`\r"; done

यह आपको रीयलटाइम में गुज़रने वाले सेकंड दिखाएगा और आप इसे रोक सकते हैं Ctrl+सी। यदि आपको अधिक सटीकता की आवश्यकता है, तो आप इसे नैनोसेकंड देने के लिए इसका उपयोग कर सकते हैं:

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

आप इन्हें बैश (या जो भी शेल आप पसंद करते हैं) फ़ंक्शंस का उपयोग करके सरल कमांड में जोड़ सकते हैं। बाश में, इन लाइनों को अपने आप में जोड़ें ~/.bashrc ( sleep 0.1 सिस्टम प्रत्येक रन के बीच एक सेकंड के 1/10 वें के लिए इंतजार करेगा ताकि आप अपने सीपीयू को स्पैम न करें):

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
}

फिर आप चलकर एक मिनट का उलटी गिनती टाइमर शुरू कर सकते हैं:

countdown 60

आप दो घंटों के साथ उलटी गिनती कर सकते हैं:

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 घंटे इंतजार नहीं करना चाहता था। यह काम करना चाहिए लेकिन कृपया मुझे बताएं अगर ऐसा नहीं होता है।


166
2018-06-24 22:11



मैंने इन अच्छे कार्यों को मेरे साथ जोड़ा .zshrc आपके जवाब को पढ़ने के ठीक बाद। आज मैंने इस्तेमाल किया countdown पहली बार और एक उच्च CPU उपयोग देखा। मैंने एक जोड़ा sleep 0.1 (मुझे नहीं पता कि एक अंशकालिक दूसरे का नींद का समय सभी प्रणालियों पर समर्थित है) जिसने बहुत सुधार किया है। दोष निश्चित रूप से कम सटीक प्रदर्शन सटीकता है, लेकिन मैं अधिकतम के विचलन के साथ रह सकता हूं। 100ms। - mpy
इसका उल्लेख करने के लिए @ mpy धन्यवाद। मुझे ऐसा करने पर ~ 3% CPU उपयोग मिल रहा है bash, मैं इसके साथ रह सकता हूं (हालांकि यह है मेरी अपेक्षा से अधिक और मैंने अपनी नींद भी अपनी .bashrc में जोड़ दी है)। - terdon
@terdon: मुझे यह स्वीकार करना होगा कि मैंने इसे पुरानी मशीन (2007 ?!) पर इस्तेमाल किया था और सीपीयू 18% तक चला गया ... अन्यथा शायद मैंने देखा नहीं होगा। - mpy
बस यह जवाब मिला। मैंने स्टॉपवॉच फ़ंक्शन में इको कथन की शुरुआत में कैरिज रिटर्न डालने में पाया था क्योंकि स्टॉपवॉच को मारने का मतलब वर्तमान स्टॉपवॉच टाइम को ओवरराइट नहीं किया गया था: echo -ne "\ r $ (date -u --date @ $ ((date +%s - $ तारीख 1)) +% एच:% एम:% एस) "; - mkingston
@ चिशाकू: ओएस एक्स पर, यह मेरे लिए काम करना प्रतीत होता था: echo -ne "$(date -ju -f %s $(($date1 - तारीख +% एस)) +%H:%M:%S)\r"; - user1071847


मेरा पसंदीदा तरीका है:

शुरु:

time cat

रुकें:

ctrl+c

जैसा कि @wjandrea नीचे टिप्पणी की, एक और संस्करण चलाने के लिए है:

time read

और दबाएं Enter रोकने के लिए


85
2018-03-30 08:26



+1। लाइफहेकर ने इस चाल को दिखाया। - Nathan Arthur
इसी तरह, लेकिन आप इसे रोकने के लिए एंटर दबा सकते हैं: time read - wjandrea
time read zsh में विफल रहता है, लेकिन time (read) काम करता है। - Sparhawk
समस्या यह है कि, आप इसे रद्द किए बिना या इसे खत्म किए बिना समय नहीं देख सकते हैं। जब आप इसे पुनरारंभ करते हैं, टाइमर फिर से शुरू होता है। - Zelphir


मैं एक ही चीज़ की तलाश में था और पाइथन में कुछ और विस्तृत लिखना समाप्त कर दिया:

यह आपको एक साधारण 10-सेकंड उलटी गिनती देगा:

sudo pip install termdown
termdown 10

स्रोत: https://github.com/trehn/termdown


29
2018-06-06 07:06



@DoktoroReichard: ठीक है, यह एक डाउनलोड लिंक है। - harrymc
पायथन 3.x के साथ काम नहीं करता है - Suhaib
@ सुहाइब: यह मेरे लिए करना चाहिए और करता है। अधिक जानकारी के साथ कृपया गिटहब पर एक मुद्दा उठाएं। - trehn
मुझे यह पसंद है - यह मेरी गली ठीक है - Wayne Werner
बहुत अच्छा, मुझे ASCII पसंद है - Guillermo


मैंने इसका इस्तेमाल किया है:

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"

यहाँ एक है स्रोत


12
2018-06-26 19:52



POSIX अनुपालन - ओएस एक्स पर काम करता है :) - djule5


sh-3.2# man leave

15 मिनट के लिए एक टाइमर सेट करें

sh-3.2# leave +0015
Alarm set for Thu Nov  3 14:19:31 CDT 2016. (pid 94317)
sh-3.2#

संपादित करें: मेरे पास लिंक का एक गुच्छा खुला था, और मैंने सोचा कि यह ओएसएक्स के लिए विशिष्ट था, इसके बारे में खेद है। मेरा जवाब छोड़कर अन्य लोग बीएसडी पर छुट्टी के बारे में जानते हैं।


12
2017-11-03 19:06



लिनक्स में भी काम छोड़ें, लेकिन पहले आपको डिफॉल्ट रिपॉजिटरीज़ से छुट्टी कार्यक्रम स्थापित करना होगा। - karel


यह दूसरे के सौवां भाग के साथ स्टॉपवॉच के लिए है:

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

उदाहरण


6
2017-12-29 05:42



अच्छा लिनक्स-केवल समाधान! मुझे बाहरी कॉल की कमी पसंद है। ध्यान दें, मेरे डेबियन सिस्टम में दो मान / proc / uptime में हैं, दूसरे अनुमानतः मेरे पिछले अपटाइम का जिक्र करते हुए। इस स्क्रिप्ट को हल करने के लिए समायोजित किया जा सकता है कि लाइन 5 को बदलकर return $1 - Adam Katz


मैंने बहुत अच्छे टेरडन के जवाब को एक साथ काम किया है, जो एक ही समय में शुरू होने के बाद से समय प्रदर्शित करता है, और अंत तक समय प्रदर्शित करता है। तीन प्रकार भी हैं इसलिए कॉल करना आसान है (आपको बैश गणित करने की ज़रूरत नहीं है), और यह भी सारणित है। उपयोग का उदाहरण:

{ ~ }  » 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]})) 
}

इसे किसी तरह से संयोजित करें ध्वनि बजाना लिनक्स टर्मिनल में (लिनक्स कमांड लाइन के माध्यम से एमपी 3 या WAV फ़ाइल चलाएं) या साइगविन (cat /path/foo.wav > /dev/dsp  बाबून / win7 में मेरे लिए काम करता है) और आपके पास एक है अलार्म के साथ सरल लचीला टाइमर!


4
2018-02-01 14:42





एक और दृष्टिकोण

countdown=60 now=$(date +%s) watch -tpn1 echo '$((now-$(date +%s)+countdown))'

मैक के लिए:

countdown=60 now=$(date +%s) watch -tn1 echo '$((now-$(date +%s)+countdown))'
#no p option on mac for watch

यदि कोई शून्य पर हिट करता है तो सिग्नल चाहता है, तो कोई भी उदाहरण सकता है। इसे एक कमांड के साथ बनाएं जो शून्य पर एक गैर-शून्य निकास स्थिति लौटाता है और इसे गठबंधन करता है watch -b, या कुछ, लेकिन अगर कोई और अधिक विस्तृत लिपि बनाना चाहता है, तो शायद यह जाने का रास्ता नहीं है; यह एक "त्वरित और गंदे एक-लाइनर" प्रकार का समाधान है।


मुझे पसंद है watch सामान्य रूप से कार्यक्रम। मैंने इसे पहले देखा था जब मैंने पहले से ही अनगिनत लिखा था while sleep 5; do विभिन्न प्रभावों के लिए loops। watch राक्षस रूप से अच्छा था।


4
2017-08-21 19:13





मैंने अपना खुद का खोल स्क्रिप्ट लिखना समाप्त कर दिया: जिथब गिस्ट

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

3
2018-06-25 00:40



अच्छी लिपि, +1। बस इतना आप जानते हैं, यह एक उलटी गिनती टाइमर है, स्टॉपवॉच नहीं। - terdon
हा आप सही हैं, जो मैं वास्तव में चाहता था। मैं अपना नामकरण अपडेट करूंगा। - tir38