OSX bash, команда 'watch' - PullRequest
       46

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

257 голосов
/ 06 марта 2012

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

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

Ответы [ 13 ]

465 голосов
/ 29 апреля 2014

При Homebrew установлено:

brew install watch

296 голосов
/ 06 марта 2012

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

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
37 голосов
/ 25 января 2013

Использование macports :

$ sudo port install watch
16 голосов
/ 10 декабря 2012

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

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
13 голосов
/ 06 марта 2012

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

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

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

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

Но вам действительно лучше установить часы , так как это не очень чисто ..

5 голосов
/ 07 декабря 2014

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

brew install watch

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

brew install visionmedia-watch

https://github.com/tj/watch

4 голосов
/ 19 ноября 2013

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

function watch {
    while :; do clear; date; echo; $@; sleep 2; done
}
2 голосов
/ 03 декабря 2013

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

Когда я гуглил, недавно наткнулся на эту ссылку.Это не совсем «установка программного обеспечения», просто получение двоичного файла для команды «смотреть».

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

1 голос
/ 05 марта 2019

Используйте менеджер пакетов nix !

Установите nix, затем nix-env -iA nixpkgs.watch, и он должен быть доступен для использования после выполнения инструкций по установке (включая получение . "$HOME/.nix-profile/etc/profile.d/nix.sh" в вашей оболочке)).

...