web-dev-qa-db-fra.com

OSX bash, commande 'regarder'

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?

260
joseph.hainline

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
303
Daniel Pittman

Avec Homebrew installé:

brew install watch

474
seantomburke

Utilisez macports :

$ Sudo port install watch
37
GoTLiuM

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
15
IT Gumby

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
13
ghoti

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

9
Marvin Pinto

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

https://github.com/tj/watch

5
A_funs

Ou, dans votre ~/.bashrc

function watch {
    while :; do clear; date; echo; $@; sleep 2; done
}
4
jon

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

2
sugavaneshb

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

1
tungv

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
1
Robert Nagtegaal

Voici une version légèrement modifiée de cette réponse que:

  • vérifie les arguments valides
  • affiche un titre de date et de durée en haut
  • déplace l'argument "duration" sur le 1er argument, de sorte que des commandes complexes peuvent facilement être passées en tant qu'arguments restants.

Pour l'utiliser:

  • Sauvegarder ceci dans ~/bin/watch
  • exécuter chmod 700 ~/bin/watch dans un terminal pour le rendre exécutable.
  • essayez-le en exécutant 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
Brad Parks

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

0
galva