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

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

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

Ответ 1

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

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

Это будет работать навсегда, очистить экран, запустить вашу команду и подождать две секунды - базовую реализацию watch your_command.

Вы можете сделать этот шаг дальше и создать watch.sh script, который может принимать your_command и sleep_duration в качестве параметров:

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

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

Ответ 2

Установлен Homebrew:

brew install watch

Ответ 3

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

$ sudo port install watch

Ответ 4

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

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

Ответ 5

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

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

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

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

Ответ 6

Следуя ответам здесь:

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

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

Ответ 7

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

brew install watch

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

brew install visionmedia-watch

https://github.com/tj/watch

Ответ 8

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

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

Ответ 9

У меня была аналогичная проблема.

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

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

Ответ 10

Здесь немного изменена версия этого ответа, которая:

  • проверяет правильные аргументы
  • показывает название даты и продолжительности в верхней части
  • переносит аргумент "duration" как 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

Ответ 11

Попробуйте следующее:

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

Ответ 12

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

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

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

Ответ 13

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

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