it-swarm.com.ru

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

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

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

252
joseph.hainline

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

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
292
Daniel Pittman

С Homebrew установлено:

brew install watch

455
seantomburke

Используйте порты :

$ Sudo port install watch
36
GoTLiuM

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

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
16
IT Gumby

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

Если ваша настоящая цель состоит в том, чтобы инициировать действия на основе того, что видно из команды 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 для деталей.

Тем не менее, если вы действительно хотите периодически запускать команду, другие предоставленные ответы можно превратить в короткий сценарий оболочки:

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

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

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

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

9
Marvin Pinto

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

brew install watch

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

brew install visionmedia-watch

https://github.com/tj/watch

5
A_funs

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

function watch {
    while :; do clear; date; echo; [email protected]; sleep 2; done
}
4
jon

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

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

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

2
sugavaneshb

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

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

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

1
tungv

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

#!/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 [email protected]"; echo 
    [email protected]; 
    sleep $sleep; 
done
1
Robert Nagtegaal

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

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

1
galva

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

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

Чтобы использовать это:

  • Сохраните это в ~/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
Brad Parks