OSX बैश, 'वॉच' कमांड


292

मैं मैक OSX पर लिनक्स 'वॉच' कमांड की नकल करने का सबसे अच्छा तरीका ढूंढ रहा हूं। मैं 'टेल' और 'सेड' का उपयोग करके आउटपुट फाइल की सामग्री पर मिलान करने के लिए हर कुछ सेकंड में एक कमांड चलाना चाहता हूं।

एक मैक पर मेरा सबसे अच्छा विकल्प क्या है, और क्या यह सॉफ्टवेयर डाउनलोड किए बिना किया जा सकता है?


2
जब आप इसे स्थापित कर सकते हैं, तो आप इसे डुप्लिकेट क्यों करना चाहेंगे?
एंड्रयू मार्शल

3
क्योंकि मुझे ऑफिस के सभी मैक को अपनी स्क्रिप्ट को कॉन्फ़िगर करना होगा
joseph.hainline

मेरा सुझाव है कि आपकी स्क्रिप्ट काढ़ा स्थापित करें और फिर देखें।
AsTeR

शराब बनाने की घड़ी मेरे रास्ते या उपनाम पर कमांड लेने के लिए नहीं लगती है।
सैम बोसालिस

वैकल्पिक रूप से एक कमांड के लिए आप लॉग फाइल की निगरानी के लिए एप्लिकेशन / एप्लायसेस / यूटिलिटीज / कॉनसोल.ऐप का भी उपयोग कर सकते हैं। यह मूल खोज के साथ छानने की अनुमति देता है
जुआनमा क्यूवास

जवाबों:


335

आप शेल लूप के साथ बुनियादी कार्यक्षमता का अनुकरण कर सकते हैं:

while :; do clear; your_command; sleep 2; done

वह हमेशा के लिए लूप करेगा, स्क्रीन को साफ़ करेगा, अपनी कमांड चलाएगा, और दो सेकंड प्रतीक्षा करेगा - मूल watch your_commandकार्यान्वयन।

आप इसे एक कदम आगे ले जा सकते हैं और एक watch.shस्क्रिप्ट बना सकते हैं, जो स्वीकार कर सकती है your_commandऔर sleep_durationपैरामीटर के रूप में:

#!/bin/bash
# usage: watch.sh <your_command> <sleep_duration>

while :; 
  do 
  clear
  date
  $1
  sleep $2
done

2
मेरा मानना ​​है कि वॉच केवल आउटपुट का पहला स्क्रीनफुल शो है। यदि आप कुछ ऐसा ही करना चाहते हैं, तोyour_commandyour_command 2>&1|head -10
मार्क ईरिच

10
यह बहुत अच्छा काम करता है, लेकिन मैं sleep ${2:-1}अंतराल को वैकल्पिक बनाना पसंद करता हूं ।
डैनियल लुबरोव

2
इसके अलावा, यह echo "$(date)"बराबर है date?
डैनियल लुबरोव

5
यह पाइप के साथ भी काम नहीं करता है। यहाँ विभिन्न सुधारों के साथ एक कांटा है: daniel.lubarov.com/simple-watch-script-for-osx
डैनियल लुबरोव

watchतब काम नहीं करता जब आउटपुट एक से अधिक स्क्रीन पर हो। केवल अंत दिखाता है, जबकि watchकेवल शीर्ष दिखाता है। (न ही आदर्श है)
h__

546

Homebrew स्थापित के साथ :

brew install watch


23
निश्चित रूप से अगर आप brewमैक का उपयोग करते हैं तो जाने का रास्ता ।
मैक्सेंस

2
अधिक जानकारी की सराहना की जाएगी। जब मैं "काढ़ा घड़ी ओएक्सएक्स" खोजता हूं, तो यह शीर्ष खोज परिणाम है। संपादित करें: स्पष्ट रूप से यह एक लिनक्स कमांड है। उन लोगों के लिए जो सुनिश्चित नहीं थे कि कैसे उपयोग करें watch: stackoverflow.com/questions/13593771/…
gwg

2
यह watchकाढ़ा उपयोगकर्ता उपनाम पढ़ने के लिए प्रतीत नहीं होता है। निष्पादित करते समय watch somealias, मुझे एक आदेश मिलता है जो नहीं मिला।
RNickMcCandless

@NickMc घड़ी का उपयोग करने का उचित तरीका यह है कि watch [command]आप इसका उपयोग तब करें जब watch somealiasयह मान लिया जाए कि somealiasयह एक कमांड है जिसे आप अपने टर्मिनल में चला सकते हैं।
सीन्टोम्बुरके

38

Macports का उपयोग करें :

$ sudo port install watch

3
इसके बाद watchसीधे कमांड का उपयोग करने का कोई बेहतर तरीका नहीं है ।
ओलिवर

8
MacPorts के बजाय काढ़ा का उपयोग क्यों करें?
bmauter

1
@bmauter, प्रत्येक को अपना: stackoverflow.com/questions/21374366/…
CenterOrbit

4
@CenterOrbit, यही कारण है कि मैंने पूछा। @ joseph.hainline का कहना है कि MacPorts का उपयोग न करें, लेकिन ऐसा क्यों नहीं है। क्या watchMacPorts में कमांड का भंडाफोड़ हुआ है?
बॉमबेर

इसका भंडाफोड़ नहीं हुआ है। वह भयानक सलाह है। MacPorts शानदार काम करता है और इसमें बहुत सारे पैकेज होते हैं। इसका इस्तेमाल करें।
अली गंगजी

16

ऊपर के गोले चाल करेंगे, आप उन्हें एक उपनाम में भी बदल सकते हैं (मापदंडों को संभालने के लिए फ़ंक्शन में लपेटने की आवश्यकता हो सकती है)

alias myWatch='_() { while :; do clear; $2; sleep $1; done }; _'

उदाहरण:

myWatch 1 ls ## self-explanatory
myWatch 5 "ls -lF $HOME" ## every 5 seconds, list out home dir; double-quotes around command to keep its args together

वैकल्पिक रूप से, homebrew http://procps.sourceforge.net/ से घड़ी स्थापित कर सकता है

brew install watch

14

यह हो सकता है कि "घड़ी" वह नहीं है जो आप चाहते हैं। आप शायद अपनी समस्या को हल करने में मदद मांगना चाहते हैं, न कि अपने समाधान को लागू करने में! :)

यदि आपका वास्तविक लक्ष्य कमांड से देखी जाने वाली क्रियाओंtail को ट्रिगर करना है , तो आप इसे पूंछ के हिस्से के रूप में कर सकते हैं। "समय-समय पर" चलाने के बजाय, जो है वह watchकरता है, आप मांग पर अपना कोड चला सकते हैं ।

#!/bin/sh

tail -F /var/log/somelogfile | while read line; do
  if echo "$line" | grep -q '[Ss]ome.regex'; then
    # do your stuff
  fi
done

नोट करें कि tail -Fयह लॉग फ़ाइल का पालन करना जारी रखेगा, भले ही वह समाचार-पत्र या लॉगोटेट द्वारा घुमाया गया हो। आप निचले मामले के बजाय इसका उपयोग करना चाहते हैं tail -fman tailविवरण के लिए जाँच करें।

कहा कि, यदि आप वास्तव में समय-समय पर एक कमांड चलाना चाहते हैं, तो उपलब्ध कराए गए अन्य उत्तर एक छोटी शेल स्क्रिप्ट में बदल सकते हैं:

#!/bin/sh
if [ -z "$2" ]; then
  echo "Usage: $0 SECONDS COMMAND" >&2
  exit 1
fi

SECONDS=$1
shift 1
while sleep $SECONDS; do
  clear
  $*
done

दुर्भाग्य से यह शेल स्क्रिप्ट बैश विस्तारित मापदंडों के साथ काम नहीं करता है जैसे: घड़ी 2 बिल्ली *
कोड कमांडर

1
@CodeCommander - कमांड लाइन watch 2 cat *स्क्रिप्ट चलाने से पहले मापदंडों का विस्तार करेगी, इसलिए "फू" और "बार" के साथ एक निर्देशिका में, आप cat foo barहर 2 सेकंड में दौड़ेंगे । आप किस व्यवहार की उम्मीद कर रहे थे?
घटि

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

@CodeCommander, मुझे लगता है कि आप गलत हैं। बैश (जैसे श) *आपके द्वारा चलाए जा रहे आदेश के बिना इसे विस्तारित करता है। दौड़ने की कोशिश करें: mkdir /tmp/zz; touch /tmp/zz/foo; watch -n 2 ls -l /tmp/zz/*एक खिड़की में। जबकि यह चल रहा है, आप touch /tmp/zz/barदूसरी विंडो में कर सकते हैं। देखें कि क्या आपकी "घड़ी" परिवर्तन को देखती है, पहली विंडो में। मुझे नहीं लगता कि यह होगा। यह मेरे लिए नहीं है। इसका उबंटू बनाम OSX या लिनक्स बनाम यूनिक्स से कोई लेना-देना नहीं है, यह bashस्वयं का व्यवहार है।
ghoti

1
@ghoti, आप सही कह रहे हैं। मुझे गलत समझा गया था। यहां तक ​​कि लिनक्स वॉच कमांड के साथ आपको उद्धरणों का उपयोग करने की आवश्यकता है: watch "ls -l /tmp/zz/*"लेकिन यदि आपको उद्धरण चिह्नों का उपयोग करना याद है तो यह आपकी स्क्रिप्ट के साथ भी काम करता है। :)
कोड कमांडर

10

यहाँ से जवाब के साथ जा रहे हैं :

bash -c 'while [ 0 ]; do <your command>; sleep 5; done'

लेकिन आप वास्तव में घड़ी को स्थापित करने से बेहतर हैं क्योंकि यह बहुत साफ नहीं है ।


11
अब और भी आसानbrew install watch
पीटर होस्ट

6

अगर घड़ी के माध्यम से स्थापित नहीं करना चाहता है

brew install watch

एक और समान / कॉपी संस्करण है जो मेरे लिए पूरी तरह से स्थापित और काम करता है

brew install visionmedia-watch

https://github.com/tj/watch


5

या, अपने ~ / .bashrc में

function watch {
    while :; do clear; date; echo; $@; sleep 2; done
}

2

मुझे भी ऐसी ही समस्या का समाधान करना पड़ा था।

जब मैंने गुगली की, तो मैं हाल ही में इस लिंक पर आया। यह वास्तव में 'सॉफ़्टवेयर स्थापित करना' नहीं है, बस 'वॉच' कमांड के लिए बाइनरी प्राप्त करना है।

और लिंक OSX के लिए वॉच कमांड है


1

यहाँ इस जवाब का थोड़ा बदला हुआ संस्करण है कि:

  • मान्य args के लिए जाँच
  • शीर्ष पर एक दिनांक और अवधि शीर्षक दिखाता है
  • "अवधि" तर्क को 1 तर्क बनाता है, इसलिए शेष तर्कों के रूप में जटिल आदेशों को आसानी से पारित किया जा सकता है।

इसके प्रयेाग के लिए:

  • इसको बचाओ ~/bin/watch
  • निष्पादित chmod 700 ~/bin/watch के लिए एक टर्मिनल में ।
  • इसे चलाकर देखें watch 1 echo "hi there"

~ / Bin / घड़ी

#!/bin/bash

function show_help()
{
  echo ""
  echo "usage: watch [sleep duration in seconds] [command]"
  echo ""
  echo "e.g. To cat a file every second, run the following"
  echo ""
  echo "     watch 1 cat /tmp/it.txt" 
  exit;
}

function show_help_if_required()
{
  if [ "$1" == "help" ]
  then
      show_help
  fi
  if [ -z "$1" ]
    then
      show_help
  fi
}

function require_numeric_value()
{
  REG_EX='^[0-9]+$'
  if ! [[ $1 =~ $REG_EX ]] ; then
    show_help
  fi
}

show_help_if_required $1
require_numeric_value $1

DURATION=$1
shift

while :; do 
  clear
  echo "Updating every $DURATION seconds. Last updated $(date)"
  bash -c "$*"
  sleep $DURATION
done

1

इसे इस्तेमाल करे:

#!/bin/bash
# usage: watch [-n integer] COMMAND

case $# in
    0)
        echo "Usage $0 [-n int] COMMAND"
        ;;
    *)      
        sleep=2;
        ;;
esac    

if [ "$1" == "-n" ]; then
    sleep=$2
    shift; shift
fi


while :; 
    do 
    clear; 
    echo "$(date) every ${sleep}s $@"; echo 
    $@; 
    sleep $sleep; 
done

1

चंचलता को रोकने के लिए जब आपका मुख्य कमांड पूरा होने में समय लगता है, तो आप आउटपुट पर कब्जा कर सकते हैं और स्क्रीन को केवल तब ही साफ कर सकते हैं जब यह पूरा हो गया हो।

function watch {while :; do a=$($@); clear; echo "$(date)\n\n$a"; sleep 1; done}

इसके बाद इसका उपयोग करें: watch istats


0

निक्स पैकेज मैनेजर का प्रयोग करें !

निक्स को स्थापित करें, nix-env -iA nixpkgs.watchऔर फिर इंस्टॉल निर्देशों ( . "$HOME/.nix-profile/etc/profile.d/nix.sh"आपके शेल में सोर्सिंग सहित ) को पूरा करने के बाद यह उपयोग के लिए उपलब्ध होना चाहिए ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.