OSX bash,'watch'命令

jos*_*ine 270 macos bash automation watch

我正在寻找在Mac OSX上复制Linux"watch"命令的最佳方法.我想每隔几秒运行一个命令,使用'tail'和'sed'对输出文件的内容进行模式匹配.

什么是我在Mac上的最佳选择,是否可以在不下载软件的情况下完成?

sea*_*rke 499

随着Homebrew的安装:

brew install watch

  • 如果你在mac上使用`brew`,那肯定是要走的路. (20认同)
  • 这和接受的答案都很好。如果您在安装后运行“man watch”,您会发现它比简单的命令/脚本具有更多功能,从默认持续时间和可选开关(-n)开始。如果避免依赖关系是首要任务,那么接受的答案就很好,但除此之外,“brew install watch”只需最少的努力,并为您提供使用 Linux 时可能会习惯的功能。 (4认同)
  • 更多细节将不胜感激。当我搜索“brew watch osx”时,这是最热门的搜索结果。**编辑:显然这是一个 Linux 命令。对于那些不确定如何使用 `watch` 的人:** http://stackoverflow.com/questions/13593771/linux-repeat-command-automatically (3认同)
  • brew的“ watch”似乎没有读取用户别名。当执行`watch somealias`时,找不到命令。 (2认同)
  • @NickMc 使用 watch 的正确方法是在使用 `watch somealias` 时执行 `watch [command]`,它假设 `somealias` 是一个可以在终端中运行的命令。 (2认同)

Dan*_*man 313

您可以使用shell循环模拟基本功能:

while :; do clear; your_command; sleep 2; done
Run Code Online (Sandbox Code Playgroud)

这将永远循环,清除屏幕,运行您的命令,并等待两秒钟 - 基本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
Run Code Online (Sandbox Code Playgroud)

  • 这很好用,但我更喜欢`sleep $ {2:-1}`来使区间可选. (9认同)
  • 它也不适用于管道.这是一个有各种改进的分支:http://daniel.lubarov.com/simple-watch-script-for-osx (5认同)
  • 我相信手表只显示第一屏输出.如果你想做类似的事情,可以将`your_command`改为`your_command 2>&1 | head -10` (2认同)
  • 另外,它是`echo'$(date)"`相当于`date`? (2认同)

小智 38

使用端口:

$ sudo port install watch
Run Code Online (Sandbox Code Playgroud)

  • 为什么使用brew而不是MacPorts? (8认同)
  • @CenterOrbit,这正是我问的原因.@ joseph.hainline说不要使用MacPorts,但不说明原因.`watch`命令是否在MacPorts中被破坏? (4认同)
  • 我从未从使用 MacPorts 的情绪中恢复过来。它最终把我的系统搞得一团糟,我不得不彻底重新格式化我的硬盘。Homebrew 一直都是——我挑战你找到一些流行的东西,这些东西在端口上不是在 HB 上。 (3认同)
  • 没有更好的方法直接使用`watch`命令. (2认同)
  • @bmauter,每个人自己的:http://stackoverflow.com/questions/21374366/what-is-the-difference-usage-of-homebrew-macports-or-other-package-installation (2认同)

IT *_*mby 16

上面的shell将完成这个技巧,你甚至可以将它们转换为别名(可能需要包装一个函数来处理参数)

alias myWatch='_() { while :; do clear; $2; sleep $1; done }; _'
Run Code Online (Sandbox Code Playgroud)

例子:

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
Run Code Online (Sandbox Code Playgroud)

或者,自制软件可以从http://procps.sourceforge.net/安装手表

brew install watch
Run Code Online (Sandbox Code Playgroud)


gho*_*oti 14

可能是"手表"不是你想要的.您可能希望在解决问题时寻求帮助,而不是在实施解决方案时!:)

如果您的真正目标是根据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
Run Code Online (Sandbox Code Playgroud)

请注意,tail -F即使日志文件被newsyslog或logrotate轮换,它也会继续跟踪日志文件.您想使用它而不是小写tail -f.检查man tail细节.

也就是说,如果您确实想要定期运行命令,则提供的其他答案可以转换为简短的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
Run Code Online (Sandbox Code Playgroud)


Mar*_*nto 9

回答这里的答案:

bash -c 'while [ 0 ]; do <your command>; sleep 5; done'
Run Code Online (Sandbox Code Playgroud)

但你最好安装手表,因为这不是很干净 ..

  • 现在甚至更容易`brew install watch` (11认同)

小智 6

或者,在您的~/.bashrc文件中:

function watch {
    while :; do clear; date; echo; $@; sleep 2; done
}
Run Code Online (Sandbox Code Playgroud)


A_f*_*uns 6

如果手表不想通过安装

brew install watch
Run Code Online (Sandbox Code Playgroud)

还有另一个类似/复制版本安装并完美地为我工作

brew install visionmedia-watch
Run Code Online (Sandbox Code Playgroud)

https://github.com/tj/watch


小智 6

为了防止在主命令需要可感知的时间才能完成时闪烁,您可以捕获输出并仅在完成后清除屏幕。

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

然后通过以下方式使用它:

watch istats
Run Code Online (Sandbox Code Playgroud)