source

OS X Bash, 'watch' 명령

ittop 2023. 5. 27. 11:57
반응형

OS X Bash, 'watch' 명령

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

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

홈브루 설치 시:

brew install watch

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

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

그것은 영원히 반복될 것이고, 화면을 지우고, 명령을 실행하고, 2초 동안 기다릴 것입니다 - 기본.watch your_command실행.

이것을 한 단계 더 나아가서 생성할 수 있습니다.watch.sh허용할 수 있는 스크립트your_command그리고.sleep_duration매개 변수로:

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

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

MacPort 사용:

$ sudo port install watch

위의 셸은 유용하며, 별칭으로 변환할 수도 있습니다(파라미터를 처리하기 위해 함수를 래핑해야 할 수도 있습니다).

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 directory; double-quotes around command to keep its arguments together

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

brew install watch

어쩌면 "시계"가 당신이 원하는 것이 아닐 수도 있습니다.여러분은 아마도 솔루션 구현이 아닌 문제 해결에 도움을 요청하고 싶을 것입니다!:)

실제 목표가 명령어에 표시된 내용을 기반으로 작업을 트리거하는 이라면, 꼬리 자체의 일부로 트리거할 수 있습니다."주기적으로" 실행하는 대신에, 그것은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 -c 'while [ 0 ]; do <your command>; sleep 5; done'

하지만 시계를 설치하는 것이 더 낫습니다. 왜냐하면 이것은 그다지 깨끗하지 않기 때문입니다.

Watch가 설치를 원하지 않는 경우

brew install watch

설치되어 완벽하게 작동하는 다른 유사/복사 버전이 있습니다.

brew install visionmedia-watch

https://github.com/tj/watch

또는 ~/.bashrc 파일에서 다음을 수행합니다.

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

기본 명령을 완료하는 데 인식할 수 있는 시간이 걸릴 때 깜박임을 방지하려면 출력을 캡처하고 완료된 후 화면을 지울 수 있습니다.

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

그런 다음 다음 사용자:

watch istats

사용해 보십시오.

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

다음은 이 답변의 약간 변경된 버전입니다.

  • 유효한 인수 확인
  • 맨 위에 날짜 및 기간 제목 표시
  • 를 사용하면 복잡한 명령어를 나머지 인수로 쉽게 전달할 수 있도록 "complex" 인수를 첫 번째 인수로 이동합니다.

사용 방법:

  • 에 합니다.~/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

Nix 패키지 관리자를 사용합니다!

Nix 설치수다행다니합음을고를 합니다.nix-env -iA nixpkgs.watch을 완료한 후 사용할 수 있어야 .. "$HOME/.nix-profile/etc/profile.d/nix.sh"당신의 껍데기 안에).

watchLinux에서 사용할 수 있는 명령은 macOS에 없습니다.사용하지 않으려는 경우brew이 bash 함수를 셸 프로필에 추가할 수 있습니다.

# execute commands at a specified interval of seconds
function watch.command {
  # USAGE: watch.commands [seconds] [commands...]
  # EXAMPLE: watch.command 5 date
  # EXAMPLE: watch.command 5 date echo 'ls -l' echo 'ps | grep "kubectl\\\|node\\\|npm\\\|puma"'
  # EXAMPLE: watch.command 5 'date; echo; ls -l; echo; ps | grep "kubectl\\\|node\\\|npm\\\|puma"' echo date 'echo; ls -1'
  local cmds=()
  for arg in "${@:2}"; do
    echo $arg | sed 's/; /;/g' | tr \; \\n | while read cmd; do
      cmds+=($cmd)
    done
  done
  while true; do
    clear
    for cmd in $cmds; do
      eval $cmd
    done
    sleep $1
  done
}

https://gist.github.com/Gerst20051/99c1cf570a2d0d59f09339a806732fd3

언급URL : https://stackoverflow.com/questions/9574089/os-x-bash-watch-command

반응형