OSX bash, команда' watch'


Я ищу лучший способ дублировать команду Linux "watch" на Mac OSX. Я хотел бы запускать команду каждые несколько секунд, чтобы сопоставить шаблон с содержимым выходного файла, используя "хвост" и "sed".

что мой лучший вариант на Mac, и можно ли это сделать без загрузки программного обеспечения?

12 221

12 ответов:

вы можете эмулировать основную функциональность с помощью цикла оболочки:

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
  
  sleep 
done

С доморощенного установлено:

brew install watch

использовать порты:

$ sudo port install watch

вышеприведенные оболочки сделают трюк, вы даже можете преобразовать их в псевдоним (возможно, потребуется обернуть в функцию для обработки параметров)

alias myWatch='_() { while :; do clear; ; sleep ; 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

это может быть, что "смотреть" - это не то, что вы хотите. Вы, вероятно, хотите обратиться за помощью в решении вашей проблемы, а не в реализации вашего решения! :)

если ваша настоящая цель-это триггер действия, основанные на том, что видно из 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 будет продолжайте следить за файлом журнала, даже если он вращается с помощью newsyslog или logrotate. Вы хотите использовать это вместо нижнего регистра tail -f. Проверьте man tail для сведения.

тем не менее, если вы действительно хотите периодически выполнять команды также может быть превращен в короткий shell-скрипт:

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

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

идем с ответом от здесь:

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

но тебе действительно лучше установка смотреть как это не очень очистить..

или, в вашем ~/.bashrc

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

если часы не хотят устанавливать через

brew install watch

есть еще одна подобная / копия версия, которая установлена и отлично работает для меня

brew install visionmedia-watch

https://github.com/tj/watch

У меня была похожая проблема.

когда я гуглил, я недавно наткнулся на эту ссылку. Это не совсем "установка программного обеспечения", просто получение двоичной команды "watch".

и ссылка получить команду watch для OSX

вот немного измененная версия этого ответа что:

  • проверяет наличие действительного аргумента
  • показывает название даты и продолжительности в верхней части
  • перемещает аргумент "длительность" в качестве первого аргумента, поэтому сложные команды могут быть легко переданы в качестве остальных аргументов.

использовать:

  • сохранить это ~/bin/watch
  • выполнить chmod 700 ~/bin/watch в терминале, чтобы сделать его выполнимый.
  • попробуйте работает watch 1 echo "hi there"

~ / bin / watch

#!/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 [ "" == "help" ]
  then
      show_help
  fi
  if [ -z "" ]
    then
      show_help
  fi
}

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

show_help_if_required 
require_numeric_value 

DURATION=
shift

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

попробуйте это:

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

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

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


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

чтобы предотвратить мерцание, когда ваша основная команда занимает заметное время для завершения, вы можете захватить вывод и только очистить экран, когда это будет сделано.

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

затем использовать его: watch istats