ওএসএক্স বাশ, 'ওয়াচ' কমান্ড


292

আমি ম্যাক ওএসএক্সে লিনাক্স 'ওয়াচ' কমান্ডটি সদৃশ করার সর্বোত্তম উপায়টি সন্ধান করছি। 'লেজ' এবং 'সেড' ব্যবহার করে আউটপুট ফাইলের সামগ্রীতে প্যাটার্ন মিলতে আমি কয়েক সেকেন্ড পরে একটি কমান্ড চালাতে চাই।

ম্যাকের ক্ষেত্রে আমার সেরা বিকল্পটি কী, এবং সফ্টওয়্যার ডাউনলোড না করে এটি করা যায়?


2
আপনি কেবল এটি ইনস্টল করতে পারলে আপনি কেন এটির নকল করতে চান?
অ্যান্ড্রু মার্শাল 21

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_commandকরুনyour_command 2>&1|head -10
মার্ক এরিচ

10
এটি বেশ ভালভাবে কাজ করে তবে আমি sleep ${2:-1}অন্তরকে optionচ্ছিক করতে পছন্দ করি ।
ড্যানিয়েল লুবারভ

2
এছাড়াও, এটি echo "$(date)"সমান date?
ড্যানিয়েল লুবারভ

5
এটি পাইপ দিয়েও কাজ করে না। বিভিন্ন উন্নতির সাথে এখানে একটি কাঁটাচামচ রয়েছে: daniel.lubarov.com/simple-watch-script-for-osx
ড্যানিয়েল লুবারভ

watchআউটপুট একাধিক স্ক্রিনের মতো হলে কাজ করে না । শুধুমাত্র শেষ দেখায়, যখন watchকেবল শীর্ষগুলি দেখায়। (
উভয়ই

545

সঙ্গে Homebrew ইনস্টল হয়েছে:

brew install watch


23
আপনি brewম্যাক ব্যবহার করলে অবশ্যই যাওয়ার উপায় ।
ম্যাক্সেন্স

2
আরও বিশদ প্রশংসা করা হবে। আমি যখন "ব্রিউ ওয়াচ ওএসএক্স" অনুসন্ধান করি তখন এটি শীর্ষ অনুসন্ধানের ফলাফল। সম্পাদনা: সম্ভবত এটি একটি লিনাক্স কমান্ড। যারা কিভাবে ব্যবহার করতে নিশ্চিত হতে পারিনি জন্য watch: stackoverflow.com/questions/13593771/...
gwg

2
এই watchচোলাই থেকে ব্যবহারকারীর উপনাম পড়তে মনে হচ্ছে না। এক্সিকিউট করার সময় watch somealias, আমি একটি কমান্ড পাইনি not
RNickMcCandless

@ নিকএমসি ঘড়িটি ব্যবহারের সঠিক উপায়টি হ'ল আপনি watch [command]যখন watch somealiasএটি ব্যবহার করবেন তখন ধরে নেওয়া somealiasহ'ল এটি একটি কমান্ড যা আপনি আপনার টার্মিনালে চালাতে পারেন।
সিনটম্বুরকে

38

ম্যাকপোর্টগুলি ব্যবহার করুন :

$ sudo port install watch

3
watchসরাসরি কমান্ডটি ব্যবহার করার পরে আর কোনও উপায় নেই ।
অলিভার

8
ম্যাকপোর্টের পরিবর্তে মদ কেন ব্যবহার করবেন?
বায়মাটার

1
@bmauter, প্রতিটি তাদের নিজস্ব: stackoverflow.com/questions/21374366/...
CenterOrbit

4
@ সেন্টারঅরবিট, ঠিক এই কারণেই আমি জিজ্ঞাসা করেছি। @ জোসেফ.হাইনলাইন বলেছে ম্যাকপোর্টগুলি ব্যবহার করবেন না, তবে কেন তা জানায় না। হয় watchকমান্ড MacPorts মধ্যে busted?
বম্টুটার

এটি ফাঁসানো হয়নি এটা ভয়ানক পরামর্শ। ম্যাকপোর্টস দুর্দান্ত কাজ করে এবং এতে প্রচুর প্যাকেজ রয়েছে। এটা ব্যবহার করো.
আলী গাঙ্গজি

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

পর্যায়ক্রমে, হোমব্রিউ 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
@ কোডকম্যান্ডার - কমান্ড লাইনটি watch 2 cat *স্ক্রিপ্টটি চালানোর আগে প্যারামিটারগুলি প্রসারিত করবে, সুতরাং "foo" এবং "বার" ফাইলের ডিরেক্টরিতে আপনি cat foo barপ্রতি 2 সেকেন্ডে চালাতে চান । আপনি কী আচরণের প্রত্যাশা করছিলেন?
ঘোটি

@ ঘোটি আমি কেবল উল্লেখ করছি যে উবুন্টুর ওয়াচ কমান্ডের চেয়ে আচরণটি আলাদা। উবুন্টু সংস্করণটি দৃশ্যত প্রতি দুই সেকেন্ডে কমান্ডটি চালায় (প্রতিটি বার এটি চালিত হওয়ার পরে প্যারামিটারগুলি প্রসারণ করা হবে), এই স্ক্রিপ্টটিতে প্যারামিটারগুলি চালুর আগে প্রসারিত হবে এবং তারপরে প্রতি দুই সেকেন্ডে একই পরামিতি ব্যবহার করে চলবে। সুতরাং আপনি যদি কোনও ডিরেক্টরিতে ফাইলগুলি দেখতে চান যেখানে ফাইলগুলি যুক্ত করা হয় এবং এই স্ক্রিপ্টটি সরানো হয় তবে তাতে কোনও লাভ হয় না। আপনি যখন প্রসারিত প্যারামিটারগুলি ব্যবহার না করেন এটি কার্যকর। :)
কোড কমান্ডার

@ কোডকম্যান্ডার, আমার মনে হয় আপনি ভুল হয়ে গেছেন। বাশ (sh এর মতো) *আপনার চালিত কমান্ডটি না দিয়ে প্রসারিত করে । চালানোর চেষ্টা করুন: mkdir /tmp/zz; touch /tmp/zz/foo; watch -n 2 ls -l /tmp/zz/*একটি উইন্ডোতে। চলমান অবস্থায়, আপনি touch /tmp/zz/barঅন্য উইন্ডোতে পারেন। আপনার "ঘড়ি" প্রথম উইন্ডোটিতে পরিবর্তনটি দেখুন কিনা তা দেখুন। আমি মনে করি না এটা হবে। এটা আমার জন্য না। উবুন্টু বনাম ওএসএক্স বা লিনাক্স বনাম ইউনিক্সের সাথে এর কোনও সম্পর্ক নেই, এটি নিজের আচরণ bash
ঘোটি

1
@ ঘোটি, আপনি ঠিক বলেছেন। আমি ভুল করেছিলাম. এমনকি লিনাক্স ওয়াচ কমান্ডের সাহায্যে আপনার উদ্ধৃতি ব্যবহার করা দরকার: watch "ls -l /tmp/zz/*"তবে যদি আপনি উদ্ধৃতি ব্যবহার করতে মনে করেন তবে এটি আপনার স্ক্রিপ্টের সাথেও কাজ করে। :)
কোড কমান্ডার


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

আমারও একই সমস্যা ছিল।

আমি যখন গুগল করলাম, আমি সম্প্রতি এই লিঙ্কটি পেরিয়ে এসেছি। এটি হ'ল 'সফ্টওয়্যার ইনস্টল করা' নয়, কেবল 'ওয়াচ' কমান্ডের জন্য বাইনারি পাওয়া।

এবং লিঙ্কটি হ'ল ওএসএক্সের জন্য ওয়াচ কমান্ড


1

এই উত্তরের একটি সামান্য পরিবর্তিত সংস্করণ এখানে যা:

  • বৈধ আরোগুলি জন্য চেক
  • শীর্ষে একটি তারিখ এবং সময়কাল শিরোনাম দেখায়
  • "সময়কাল" যুক্তিটিকে প্রথম আর্গুমেন্টে স্থানান্তরিত করে, তাই জটিল আज्ञাগুলি সহজেই বাকী আর্গুমেন্ট হিসাবে পাস করা যায়।

এটি ব্যবহার করতে:

  • এটিতে সংরক্ষণ করুন ~/bin/watch
  • chmod 700 ~/bin/watchটার্মিনালে এটি কার্যকর করতে কার্যকর করুন ।
  • চালিয়ে চেষ্টা করুন watch 1 echo "hi there"

~ / বিন / ঘড়ি

#!/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"আপনার শেলের স্যোসরিং সহ ) সম্পূর্ণ করার পরে এটি ব্যবহারের জন্য উপলব্ধ হওয়া উচিত ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.