Estoy buscando la mejor manera de duplicar el comando 'watch' de Linux en Mac OSX. Me gustaría ejecutar un comando cada pocos segundos para hacer coincidir el patrón en el contenido de un archivo de salida usando 'tail' y 'sed'.
¿Cuál es mi mejor opción en una Mac? ¿Se puede hacer sin descargar el software?
Puede emular la funcionalidad básica con el bucle de Shell:
while :; do clear; your_command; sleep 2; done
Eso se repetirá para siempre, borre la pantalla, ejecute su comando y espere dos segundos, la implementación básica de watch your_command
.
Puede llevar esto un paso más allá y crear un script watch.sh
que pueda aceptar your_command
y sleep_duration
como parámetros:
#!/bin/bash
# usage: watch.sh <your_command> <sleep_duration>
while :;
do
clear
date
$1
sleep $2
done
Con Homebrew instalado:
brew install watch
Utilice puertos :
$ Sudo port install watch
los shells anteriores harán el truco, incluso podría convertirlos a un alias (puede que tenga que ajustarse en una función para manejar los parámetros)
alias myWatch='_() { while :; do clear; $2; sleep $1; done }; _'
Ejemplos:
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
Alternativamente, homebrew puede instalar el reloj desde http://procps.sourceforge.net/
brew install watch
Puede ser que "ver" no sea lo que quieres. ¡Probablemente quiera pedir ayuda para resolver su problema, no para implementar su solución! :)
Si su objetivo real es desencadenar acciones basadas en lo que se ve desde el comando tail
, entonces puede hacerlo como parte de la propia cola. En lugar de ejecutar "periódicamente", que es lo que hace watch
, puede ejecutar su 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
Tenga en cuenta que tail -F
continuará siguiendo un archivo de registro aunque se gire por newsyslog o logrotate Desea utilizar esto en lugar del tail -f
minúsculo. Compruebe man tail
para más detalles.
Dicho esto, si realmente desea ejecutar un comando periódicamente, las otras respuestas proporcionadas se pueden convertir en un breve script de Shell:
#!/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
Yendo con la respuesta de aquí :
bash -c 'while [ 0 ]; do <your command>; sleep 5; done'
Pero realmente estás mejor instalando el reloj ya que esto no es muy limpio ..
Si el reloj no quiere instalar via
brew install watch
Hay otra versión similar/copia que se instaló y funcionó perfectamente para mí
brew install visionmedia-watch
O, en tu ~/.bashrc
function watch {
while :; do clear; date; echo; [email protected]; sleep 2; done
}
Tuve un problema similar.
Cuando busqué en Google, encontré este enlace recientemente. Esto no es exactamente 'instalar software', simplemente obteniendo el binario para el comando 'ver'.
Y el enlace es Obtener comando de reloj para OSX
para evitar el parpadeo cuando su comando principal tarda un tiempo perceptible en completarse, puede capturar la salida y solo borrar la pantalla cuando se hace.
function watch {while :; do a=$([email protected]); clear; echo "$(date)\n\n$a"; sleep 1; done}
entonces úselo por: watch istats
Prueba esto:
#!/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
Utilice el nix package manager!
Instale nix, luego nix-env -iA nixpkgs.watch
y debería estar disponible para su uso después de completar las instrucciones de instalación (incluida la fuente . "$HOME/.nix-profile/etc/profile.d/nix.sh"
en su Shell).
Aquí hay una versión ligeramente modificada de esta respuesta que:
Para usarlo:
~/bin/watch
chmod 700 ~/bin/watch
en un terminal para hacerlo ejecutable.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