macos - create - OSX bash, comando ''ver''
macos create alias terminal (12)
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 software?
Aquí hay una versión ligeramente modificada de esta respuesta que:
- comprueba si hay argumentos válidos
- Muestra un título de fecha y duración en la parte superior.
- mueve el argumento de "duración" para que sea el primer argumento, por lo que los comandos complejos se pueden pasar fácilmente como los argumentos restantes.
Para usarlo:
- Guarda esto en
~/bin/watch
- ejecuta
chmod 700 ~/bin/watch
en una terminal para hacerla ejecutable. - pruébalo ejecutando
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
Con Homebrew instalado:
brew install watch
O bien, en tu ~ / .bashrc
function watch {
while :; do clear; date; echo; $@; sleep 2; done
}
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 $@"; echo
$@;
sleep $sleep;
done
Puede emular la funcionalidad básica con el bucle de shell:
while :; do clear; your_command; sleep 2; done
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 una watch.sh
comandos 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
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 la 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 incluso si es rotado por newsyslog o logrotate. Quiere usar esto en lugar de la tail -f
minúscula tail -f
. Compruebe la 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 script de shell corto:
#!/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
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
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 el comando Get watch para OSX.
Utilizar ports :
$ sudo port install watch
Yendo con la respuesta desde here :
bash -c ''while [ 0 ]; do <your command>; sleep 5; done''
Pero realmente es mejor instalar el reloj ya que esto no es muy limpio ...
los shells de arriba 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
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=$($@); clear; echo "$(date)/n/n$a"; sleep 1; done}
entonces watch istats
por: watch istats