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?

Author: Peter Mortensen, 2012-03-05

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
 369
Author: Daniel Pittman, 2015-10-22 23:29:11

Com Homebrew instalado:

brew install watch

 606
Author: seantomburke, 2016-03-29 21:43:59

Utilizar MacPorts:

$ sudo port install watch
 40
Author: GoTLiuM, 2020-06-27 17:54:05

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
 18
Author: IT Gumby, 2020-06-27 17:53:21
Pode ser que o "relógio" não seja o que tu queres. Você provavelmente quer pedir ajuda para resolver o seu problema, não para implementar a sua solução! :)

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
 14
Author: ghoti, 2012-03-05 21:47:46

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...

 10
Author: Marvin Pinto, 2020-06-27 17:48:25

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

Https://github.com/tj/watch

 7
Author: A_funs, 2014-12-07 00:54:59

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
 6
Author: tungv, 2020-06-27 17:57:12

Ou, no seu ~/.bashrc ficheiro:

function watch {
    while :; do clear; date; echo; $@; sleep 2; done
}
 5
Author: jon, 2020-06-27 17:54:17
Tive um problema semelhante. Quando pesquisei no Google, deparei-me com o post do blog. Instalar o comando de vigia no Mac OS X recentemente. Isto não é exatamente 'instalar software', mas simplesmente obter o binário para o comando' watch'.
 2
Author: sugavaneshb, 2020-06-27 17:55:51

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
 1
Author: Brad Parks, 2017-05-23 11:33:26

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
 1
Author: Robert Nagtegaal, 2014-11-15 20:59:49

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).

 1
Author: galva, 2020-06-27 17:59:24