Я ищу лучший способ дублировать команду "смотреть" 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; $@; 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 $@"; echo
$@;
sleep $sleep;
done
Ответ 12
чтобы предотвратить мерцание, когда ваша основная команда занимает воспринимаемое время, вы можете захватить вывод и только очистить экран, когда это будет сделано.
function watch {while :; do a=$($@); 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"
в твоя раковина).