OSX bash, 'watch'명령


292

Mac OSX에서 Linux 'watch'명령을 복제하는 가장 좋은 방법을 찾고 있습니다. 'tail'과 'sed'를 사용하여 출력 파일의 내용에서 패턴 일치를 위해 몇 초마다 명령을 실행하고 싶습니다.

Mac에서 가장 좋은 옵션은 무엇이며 소프트웨어를 다운로드하지 않고도 할 수 있습니까?


2
그냥 설치할 수 있는데 왜 복제하고 싶습니까?
Andrew Marshall

3
사무실에서 사용자가 내 스크립트를 사용하는 모든 Mac을 구성해야했기 때문에
joseph.hainline

나는 당신의 스크립트 설치가 양조를 한 다음 지켜 볼 것을 제안합니다.
AsTeR

brew 's watch가 내 경로 또는 별칭에서 명령을 선택하지 않는 것 같습니다.
sam boosalis

명령 대신 /Applications/Utilities/Console.app 응용 프로그램을 사용하여 로그 파일을 모니터 할 수도 있습니다. 기본 검색으로 필터링 가능
JuanMa Cuevas

답변:


335

쉘 루프를 사용하여 기본 기능을 에뮬레이션 할 수 있습니다.

while :; do clear; your_command; sleep 2; done

그것은 영원히 반복되고 화면을 지우고 명령을 실행하고 2 초 동안 기다립니다-기본 watch your_command구현

이 단계를 더 수행하고 만들 수 있습니다 watch.sh받아 들일 수 스크립트 your_commandsleep_duration매개 변수로를 :

#!/bin/bash
# usage: watch.sh <your_command> <sleep_duration>

while :; 
  do 
  clear
  date
  $1
  sleep $2
done

2
나는 시계가 첫 번째 화면 출력 만 보여줍니다. 비슷한 작업을 수행하려면 다음 your_command으로 변경하십시오 .your_command 2>&1|head -10
Mark Eirich

10
이것은 꽤 잘 작동하지만 sleep ${2:-1}간격을 선택 사항으로 만드는 것을 선호 합니다.
다니엘 루바 로프

2
또한 ?에 echo "$(date)"해당합니다 date.
다니엘 루바 로프

5
파이프에서는 작동하지 않습니다. 여기에 다양한 개선과 포크는 다음과 같습니다 daniel.lubarov.com/simple-watch-script-for-osx
다니엘 Lubarov

watch출력이 둘 이상의 화면 인 경우 처럼 작동하지 않습니다 . 끝만 watch표시하고 맨 위만 표시합니다.
h__

545

함께 브루 설치 :

brew install watch


23
brewMac에서 사용한다면 확실히 갈 길 입니다.
Maxence

2
자세한 내용은 감사하겠습니다. "brew watch osx"를 검색 할 때, 이것이 최고의 검색 결과입니다. 편집 : 분명히 Linux 명령입니다. 사용법을 잘 모르는 분들을 위해 watch: stackoverflow.com/questions/13593771/…
gwg

2
watchbrew의 이것은 사용자 별칭을 읽지 않는 것 같습니다. 를 실행할 때 watch somealias명령을 찾을 수 없습니다.
RNickMcCandless

@NickMc 시계를 사용하는 올바른 방법 은 터미널에서 실행할 수있는 명령 이라고 가정 할 watch [command]때 사용하는 watch somealias것입니다 somealias.
seantomburke

38

macports 사용 :

$ sudo port install watch

3
watch명령을 직접 사용하는 더 좋은 방법은 없습니다 .
Oliver

8
MacPorts 대신 brew를 사용하는 이유는 무엇입니까?
bmauter

1
@bmauter, 각자 자신에게 : stackoverflow.com/questions/21374366/…
CenterOrbit

4
@CenterOrbit, 이것이 바로 내가 묻는 이유입니다. @ joseph.hainline은 MacPorts를 사용하지 않지만 그 이유는 밝히지 않았습니다. 는 IS watch명령은 MacPorts를에 체포?
bmauter

파열되지 않았습니다. 그것은 끔찍한 충고입니다. MacPorts는 훌륭하게 작동하며 수많은 패키지가 있습니다. 그걸 써.
Ali Gangji

16

위의 쉘은 트릭을 수행합니다. 별칭으로 변환 할 수도 있습니다 (매개 변수를 처리하기 위해 함수를 래핑해야 할 수도 있음)

alias myWatch='_() { while :; do clear; $2; sleep $1; done }; _'

예 :

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

또는, 홈브류는 http://procps.sourceforge.net/ 에서 시계를 설치할 수 있습니다

brew install watch

14

"시계"가 원하는 것이 아닐 수도 있습니다. 솔루션 구현이 아닌 문제 해결에 도움을 요청하고 싶을 것입니다. :)

실제 목표가 command 에서 본 내용을 기반으로 작업tail실행하는 것이라면 꼬리 자체의 일부로 수행 할 수 있습니다. "정기적으로"실행하는 대신 필요에 따라watch 코드 실행할 수 있습니다 .

#!/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

참고 tail -F가 newsyslog 또는 logrotate에 의해 회전됩니다 경우에도 로그 파일을 수행 할 것입니다. 소문자 대신 이것을 사용하고 싶습니다 tail -f. man tail자세한 내용을 확인 하십시오.

즉, 실제로 정기적으로 명령을 실행하려면 제공된 다른 답변을 짧은 쉘 스크립트로 바꿀 수 있습니다.

#!/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

불행히도이 쉘 스크립트는 다음과 같은 bash 확장 매개 변수와 함께 작동하지 않습니다 : watch 2 cat *
Code Commander

1
@CodeCommander-명령 행 watch 2 cat *은 스크립트를 실행하기 전에 매개 변수를 확장하므로 "foo"및 "bar"파일이있는 디렉토리에서는 cat foo bar2 초마다 실행 됩니다. 어떤 행동을 기대 했습니까?
ghoti

@ghoti 나는 단지 그 동작이 Ubuntu의 watch 명령과 다르다는 것을 지적하고 있습니다. 우분투 버전은 분명히 2 초마다 명령을 실행하고 (매번 실행될 때마다 매개 변수 확장)이 스크립트는 매개 변수가 실행되기 전에 확장 된 다음 2 초마다 동일한 매개 변수를 사용하여 실행됩니다. 따라서 파일이 추가 및 제거되는 디렉토리에서 파일을 보려면이 스크립트가 도움이되지 않습니다. 확장 된 매개 변수를 사용하지 않을 때 유용합니다. :)
코드 사령관

@ CodeCommander, 당신이 잘못 생각합니다. 배쉬 (sh와 같은) *는 실행 명령에 전달하지 않고 확장됩니다 . mkdir /tmp/zz; touch /tmp/zz/foo; watch -n 2 ls -l /tmp/zz/*한 창 에서 다음 을 실행하십시오 . 그것이 실행되는 동안 touch /tmp/zz/bar다른 창에서 할 수 있습니다 . 첫 번째 창에서 "시계"에 변경 사항이 표시되는지 확인하십시오. 나는 그렇게 생각하지 않습니다. 그것은 나를 위해하지 않습니다. 이것은 Ubuntu vs OSX 또는 Linux vs Unix와 관련이 없으며 bash자체 동작입니다 .
ghoti

1
@ghoti, 당신이 맞아요. 나는 착각했다. Linux watch 명령을 사용하더라도 따옴표를 사용해야합니다. watch "ls -l /tmp/zz/*"그러나 따옴표 를 기억하는 경우 스크립트에서도 작동합니다. :)
코드 사령관


6

시계를 통해 설치하지 않으려는 경우

brew install watch

나를 위해 완벽하게 설치되고 작동 한 다른 유사 / 복사 버전이 있습니다.

brew install visionmedia-watch

https://github.com/tj/watch


5

또는 ~ / .bashrc에서

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

2

나는 비슷한 문제가 있었다.

내가봤을 때 최근 에이 링크를 보았습니다. 이것은 정확히 '소프트웨어 설치'가 아니라 단순히 'watch'명령의 바이너리를 얻는 것입니다.

그리고 링크는 OSX에 대한 감시 명령입니다


1

이 답변 의 약간 변경된 버전 다음과 같습니다 .

  • 유효한 인수 확인
  • 상단에 날짜 및 기간 제목을 표시합니다
  • "duration"인수를 첫 번째 인수로 이동하므로 복잡한 명령을 나머지 인수로 쉽게 전달할 수 있습니다.

그것을 사용하려면 :

  • 이것을 저장 ~/bin/watch
  • 실행 chmod 700 ~/bin/watch은 실행하기 위해 터미널에.
  • 실행하여 시도 watch 1 echo "hi there"

~ / 빈 / 시계

#!/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

이 시도:

#!/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

주 명령을 완료하는 데 인식 가능한 시간이 걸리는 경우 깜박임을 방지하기 위해 출력을 캡처하고 완료되면 화면을 선명하게 할 수 있습니다.

function watch {while :; do a=$($@); clear; echo "$(date)\n\n$a"; sleep 1; done}

그런 다음 사용하십시오. watch istats


0

nix 패키지 관리자를 사용하십시오 !

nix를 설치 nix-env -iA nixpkgs.watch하면 설치 지침을 완료 한 후에 사용할 수 있어야합니다 ( . "$HOME/.nix-profile/etc/profile.d/nix.sh"쉘 소싱 포함 ).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.