Bash do OS X, comando 'vigiar'
Estou à procura da melhor maneira de duplicar o comando 'watch' do Linux no Mac OS X. gostaria de executar um comando a cada poucos segundos para ajustar o padrão no conteúdo de um ficheiro de saída usando 'tail' e 'sed'.
Qual é a minha melhor opção num Mac, e pode ser feito sem baixar o software?
13 answers
Você pode emular a funcionalidade básica com o loop da linha de comandos:
while :; do clear; your_command; sleep 2; done
Isso irá circular para sempre, limpar o ecrã, executar o seu comando, e esperar dois segundos - a implementação básica watch your_command
.
Você pode dar um passo adiante e criar um script watch.sh
que pode aceitar your_command
e sleep_duration
como parâmetros:
#!/bin/bash
# usage: watch.sh <your_command> <sleep_duration>
while :;
do
clear
date
$1
sleep $2
done
Com Homebrew instalado:
brew install watch
As conchas acima farão o truque, e você pode até convertê-las para um nome falso (você pode precisar de envolver uma função para lidar com os parâmetros):
alias myWatch='_() { while :; do clear; $2; sleep $1; done }; _'
Exemplos:
myWatch 1 ls ## Self-explanatory
myWatch 5 "ls -lF $HOME" ## Every 5 seconds, list out home directory; double-quotes around command to keep its arguments together
Alternadamente, Homebrew pode instalar o relógio http://procps.sourceforge.net/:
brew install watch
Se o teu verdadeiro objectivo é desencadear acções baseadas no que é visto do comando {[[2]} , então podes fazer isso como parte da própria cauda. Em vez de executar "periodicamente", que é o que watch
faz, você pode executar o seu código a pedido.
#!/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
Note que tail -F
continuará a seguir um ficheiro de Registo mesmo que é rodado por newsyslog ou logrotate. Você quer usar isso em vez da minúscula tail -f
. Verifique man tail
para mais detalhes.
Dito isto, se você realmente quiser executar um comando periodicamente, as outras respostas fornecidas podem ser transformadas em um script shell curto:
#!/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
Eu vou com a resposta de aqui:
bash -c 'while [ 0 ]; do <your command>; sleep 5; done'
Mas você está realmente melhor fora instalar relógio como isso não é muito limpo...
Se o watch não quiser instalar via
brew install watch
Existe outra versão similar / copy que instalou e funcionou perfeitamente para mim
brew install visionmedia-watch
Para evitar piscar quando o seu comando principal leva tempo perceptível para completar, você pode capturar a saída e só limpar o ecrã quando estiver feito.
function watch {while :; do a=$($@); clear; echo "$(date)\n\n$a"; sleep 1; done}
Então usa-o por:
watch istats
Ou, no seu ~/.bashrc ficheiro:
function watch {
while :; do clear; date; echo; $@; sleep 2; done
}
Aqui está uma versão ligeiramente alterada desta Resposta que:
- controlos dos args válidos
- mostra um título de data e duração no topo
- move o argumento da "duração" para ser o primeiro argumento, de modo que comandos complexos podem ser facilmente passados como os argumentos restantes.
Para o usar:
- Guarda isto para
~/bin/watch
- executar
chmod 700 ~/bin/watch
num terminal para o tornar executável.
Tente correndo.
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 [ "$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
Tenta isto:
#!/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
Usa o Nix Gestor de pacotes!
Instale Nix, e depois faça nix-env -iA nixpkgs.watch
e deverá estar disponível para utilização após o preenchimento das instruções de instalação (incluindo sourcing . "$HOME/.nix-profile/etc/profile.d/nix.sh"
na sua linha de comandos).