OSX bash, 'watch' komutu


292

Mac OSX'te Linux 'watch' komutunu çoğaltmanın en iyi yolunu arıyorum. 'Tail' ve 'sed' kullanarak bir çıktı dosyasının içeriğinde desen eşleşmesi için birkaç saniyede bir komut çalıştırmak istiyorum.

Mac'teki en iyi seçeneğim nedir ve yazılım indirilmeden yapılabilir mi?


2
Sadece kurabildiğinizde neden çoğaltmak istiyorsunuz?
Andrew Marshall

3
çünkü ben ofiste benim komut dosyası kullanıcısı tüm Macs yapılandırmak gerekir
joseph.hainline

Senaryonuzun demlenmesini ve ardından izlemesini öneririm.
AsTeR

Brew'in saati yolumda veya takma adlarda komut almıyor gibi görünüyor.
sam boosalis

Bir komuta alternatif olarak günlük dosyalarını izlemek için /Applications/Utilities/Console.app uygulamasını da kullanabilirsiniz. Temel arama ile filtreleme sağlar
JuanMa Cuevas

Yanıtlar:


336

Kabuk döngüsüyle temel işlevselliği taklit edebilirsiniz:

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

Bu sonsuza kadar dönecek, ekranı temizleyecek, komutunuzu çalıştıracak ve iki saniye bekleyecektir - temel watch your_commanduygulama.

Bunu bir adım daha ileri watch.shtaşıyabilir your_commandve sleep_durationparametre olarak kabul edebilecek bir komut dosyası oluşturabilirsiniz :

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

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

2
Saatin sadece ilk ekran çıktısını gösterdiğine inanıyorum. Eğer benzer bir şey yapmak istiyorsanız, değiştirmek your_commandiçinyour_command 2>&1|head -10
Mark Eirich

10
Bu oldukça iyi çalışıyor, ancak sleep ${2:-1}aralığı isteğe bağlı yapmayı tercih ediyorum .
Daniel Lubarov

2
Ayrıca, echo "$(date)"eşittir date?
Daniel Lubarov

5
Ayrıca borularla çalışmaz. İşte çeşitli geliştirmeler içeren bir çatal: daniel.lubarov.com/simple-watch-script-for-osx
Daniel Lubarov

watchÇıktı birden fazla ekrandaymış gibi çalışmaz . Yalnızca sonu watchgösterirken yalnızca üst kısmı gösterir. (İkisi de ideal değildir)
h__

546

İle Homebrew yüklü:

brew install watch


23
brewMac kullanıyorsanız kesinlikle yol .
Maxence

2
Daha fazla ayrıntı takdir edilecektir. "Demlemek izle osx" aradığımda, bu en iyi arama sonucudur. EDIT: Görünüşe göre bir Linux komutu. Nasıl kullanılacağından emin olmayanlar için watch: stackoverflow.com/questions/13593771/…
gwg

2
Bu watchdemlemek kullanıcı takma adlarını okumak için görünmüyor. Yürütürken watch somealias, bir komut bulunamadı.
RNickMcCandless

@NickMc saatini kullanmanın doğru yolu , terminalinizde çalıştırabileceğiniz bir komut olduğunu varsayarak watch [command]kullanmaktır . watch somealiassomealias
seantomburke

38

Macport kullanın :

$ sudo port install watch

3
watchKomutu doğrudan kullanmanın daha iyi bir yolu yoktur .
Oliver

8
MacPorts yerine neden demlemek kullanılır?
bmauter


4
@CenterOrbit, tam da bu yüzden sordum. @ joseph.hainline MacPorts kullanmadığını söylüyor ama nedenini belirtmiyor. Is watchkomut MacPorts baskın?
bmauter

Bu yakalanmadı. Bu korkunç bir tavsiye. MacPorts harika çalışıyor ve tonlarca paketi var. Kullanın.
Ali Gangji

16

yukarıdaki kabuklar hile yapacak, hatta onları bir takma ada dönüştürebilirsiniz (parametreleri işlemek için bir işlevi sarmanız gerekebilir)

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

Örnekler:

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

Alternatif olarak, homebrew saati http://procps.sourceforge.net/ adresinden yükleyebilir.

brew install watch

14

Belki "izlemek" istediğiniz şey olmayabilir. Muhtemelen çözümünüzü değil, probleminizi çözme konusunda yardım istemek istiyorsunuz! :)

Gerçek hedefiniz, komuttan görülenlere göre eylemleri tetiklemeksetail , bunu kuyruğun kendisinin bir parçası olarak yapabilirsiniz. "Periyodik olarak" çalışmak yerine, watchkodunuzu istek üzerine çalıştırabilirsiniz .

#!/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 -FBir günlük dosyasını newsyslog veya logrotate tarafından döndürülse bile takip etmeye devam edeceğini unutmayın . Bunu küçük harf yerine kullanmak istiyorsunuz tail -f. man tailAyrıntıları kontrol edin .

Bununla birlikte, gerçekten bir komutu periyodik olarak çalıştırmak istiyorsanız, sağlanan diğer cevaplar kısa bir kabuk komut dosyasına dönüştürülebilir:

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

Ne yazık ki bu kabuk betiği aşağıdaki gibi genişletilmiş bash parametreleriyle çalışmaz: watch 2 cat *
Code Commander

1
@CodeCommander - Komut satırı watch 2 cat *, komut dosyasını çalıştırmadan önce parametreleri genişletir, bu nedenle "foo" ve "bar" dosyaları içeren bir dizinde cat foo barher 2 saniyede bir çalışırsınız . Hangi davranışı bekliyordun?
ghoti

@ghoti Sadece davranışın Ubuntu'daki watch komutundan farklı olduğuna işaret ediyorum. Ubuntu sürümü, komutu her iki saniyede bir çalıştırıyor (parametreleri her çalıştırıldığında genişletiyor), bu komut dosyası çalıştırılmadan önce parametreleri genişletiyor ve sonra her iki saniyede bir aynı parametreleri kullanarak çalışıyor. Dolayısıyla, dosyaların eklendiği ve kaldırıldığı bir dizindeki dosyaları izlemek istiyorsanız bu komut dosyası yardımcı olmaz. Yine de genişletilmiş parametreleri kullanmadığınızda faydalıdır. :)
Kod Komutanı

@CodeCommander, sanırım yanılıyorsunuz. Bash (sh gibi) *çalıştırdığınız komuta geçmeden genişler . Çalışmayı deneyin: mkdir /tmp/zz; touch /tmp/zz/foo; watch -n 2 ls -l /tmp/zz/*bir pencerede. Çalışırken touch /tmp/zz/barbaşka bir pencerede yapabilirsiniz . "Saatinizin" ilk pencerede değişikliği görüp görmediğine bakın. Bunun olacağını sanmıyorum. Benim için değil. Bunun Ubuntu vs OSX veya Linux vs Unix ile ilgisi yok, bu bashkendi başına bir davranış .
ghoti

1
@ghoti, haklısın. Yanılmışım. Linux watch komutuyla bile tırnak işareti kullanmanız gerekir: watch "ls -l /tmp/zz/*"ancak tırnak işareti kullanmayı hatırlarsanız, komut dosyanızla da çalışır. :)
Kod Komutanı


6

Saat, üzerinden yüklemek istemiyorsa

brew install watch

Benim için mükemmel bir şekilde kurulmuş ve çalışan başka bir benzer / kopya sürümü var

brew install visionmedia-watch

https://github.com/tj/watch


5

Veya ~ / .bashrc'nizde

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

2

Benzer bir sorun yaşadım.

Google'a gittiğimde son zamanlarda bu bağlantıyla karşılaştım. Bu tam olarak 'yazılım yüklemek' değildir, sadece 'watch' komutunun ikili kodunu alır.

Ve bağlantı OSX için İzleme komutunu al


2

ana komutunuzun tamamlanması algılanabilir zaman aldığında titremeyi önlemek için, çıktıyı yakalayabilir ve yalnızca bittiğinde ekranı temizleyebilirsiniz.

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

sonra kullanın: watch istats


Bunun echo -eyerine, echobu satır sonlarını doğru bir şekilde oluşturmak için
jez

1

İşte bu cevabın biraz değiştirilmiş bir versiyonu :

  • geçerli argümanları kontrol eder
  • üstte bir tarih ve süre başlığı gösterir
  • "duration" bağımsız değişkenini 1. bağımsız değişken olarak taşır, böylece karmaşık komutlar kalan bağımsız değişkenler olarak kolayca iletilebilir.

Kullanmak için:

  • Bunu şuraya kaydet: ~/bin/watch
  • çalıştırılabilir chmod 700 ~/bin/watchhale getirmek için bir terminalde çalıştırın.
  • koşarak dene watch 1 echo "hi there"

~ / Bin / izle

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

Bunu dene:

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

0

Nix'i kullan paket yöneticisini !

Nix'i kurun nix-env -iA nixpkgs.watchve kurulum talimatlarını tamamladıktan sonra ( . "$HOME/.nix-profile/etc/profile.d/nix.sh"kabuğunuzda kaynak dahil) kullanıma hazır olmalıdır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.