Je cherche le meilleur moyen de dupliquer la commande Linux 'watch' sous Mac OSX. Je voudrais exécuter une commande toutes les quelques secondes pour faire correspondre le contenu d'un fichier de sortie en utilisant "tail" et "sed".
Quelle est ma meilleure option sur un Mac et peut-on le faire sans télécharger de logiciel?
Vous pouvez émuler les fonctionnalités de base avec la boucle Shell:
while :; do clear; your_command; sleep 2; done
Cela restera en boucle, effacez l’écran, exécutez votre commande et attendez deux secondes - l’implémentation de base de watch your_command
.
Vous pouvez aller plus loin et créer un script watch.sh
pouvant accepter your_command
et sleep_duration
en tant que paramètres:
#!/bin/bash
# usage: watch.sh <your_command> <sleep_duration>
while :;
do
clear
date
$1
sleep $2
done
Avec Homebrew installé:
brew install watch
Utilisez macports :
$ Sudo port install watch
les shells ci-dessus feront l'affaire, vous pouvez même les convertir en alias (vous devrez peut-être envelopper une fonction pour gérer les paramètres)
alias myWatch='_() { while :; do clear; $2; sleep $1; done }; _'
Exemples:
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
Alternativement, homebrew peut installer la montre à partir de http://procps.sourceforge.net/
brew install watch
Peut-être que "regarder" n'est pas ce que vous voulez. Vous voudrez probablement demander de l'aide pour résoudre votre problème, pas pour mettre en œuvre votre solution! :)
Si votre objectif réel est de déclencher des actions en fonction de ce que vous voyez dans la commande tail
], vous pouvez le faire en tant que partie de la queue elle-même. Au lieu d'exécuter "périodiquement", comme le fait watch
, vous pouvez exécuter votre code à la demande.
#!/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
Notez que tail -F
continuera à suivre un fichier journal même s'il est soumis à une rotation par newsyslog ou logrotate. Vous voulez utiliser ceci à la place du tail -f
minuscule. Vérifiez man tail
pour plus de détails.
Cela dit, si vous voulez vraiment exécuter une commande régulièrement, les autres réponses fournies peuvent être transformées en un court script 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
Aller avec la réponse de ici :
bash -c 'while [ 0 ]; do <your command>; sleep 5; done'
Mais vous êtes vraiment mieux installer watch car ce n'est pas très propre ..
Si watch ne veut pas installer via
brew install watch
Une autre version similaire/copie a été installée et fonctionne parfaitement pour moi.
brew install visionmedia-watch
Ou, dans votre ~/.bashrc
function watch {
while :; do clear; date; echo; $@; sleep 2; done
}
J'avais un problème similaire.
Quand j'ai googlé, je suis tombé sur ce lien récemment. Ce n'est pas exactement 'installer un logiciel', mais simplement obtenir le binaire pour la commande 'watch'.
Et le lien est Get watch watch for OSX
pour empêcher le scintillement lorsque votre commande principale prend un temps perceptible, vous pouvez capturer la sortie et effacer l'écran uniquement à la fin.
function watch {while :; do a=$($@); clear; echo "$(date)\n\n$a"; sleep 1; done}
puis utilisez-le par: watch istats
Essaye ça:
#!/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
Voici une version légèrement modifiée de cette réponse que:
Pour l'utiliser:
~/bin/watch
chmod 700 ~/bin/watch
dans un terminal pour le rendre exécutable.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
Utilisez le gestionnaire de paquets nix !
Installez nix, puis nix-env -iA nixpkgs.watch
et il devrait être disponible après avoir suivi les instructions d'installation (y compris la recherche de sources . "$HOME/.nix-profile/etc/profile.d/nix.sh"
dans votre shell).