mac有没有类似linux的watch,关于macos:OSX bash,’watch’命令

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

我在Mac电脑上的最佳选择是什么?不下载软件也能做到吗?

当您可以安装它时,为什么要复制它?

因为我必须配置办公室里所有的mac,使用我的脚本

我建议您的脚本安装BREW,然后观看。

BREW的手表似乎无法在我的路径或别名上接收命令。

除了命令之外,您还可以使用application/applications/utilities/console.app来监视日志文件。它允许使用基本搜索进行过滤

这不属于apple.stackexchange.com吗?

您可以使用像BREW这样的包管理器。

BREW的手表不支持Unicode:。/

安装了自制啤酒:

brew install watch

当然,如果你在Mac上使用brew,那该怎么办。

更多细节将不胜感激。当我搜索"BREW Watch OSX"时,这是最热门的搜索结果。编辑:显然是Linux命令。对于那些不知道如何使用watch的人:stackoverflow.com/questions/13593771/…

这个来自BREW的watch似乎没有读取用户别名。当执行watch somealias时,我得到一个未找到的命令。

@nickmc使用watch的正确方法是在使用watch somealias时执行watch [command],假设somealias是一个可以在终端中运行的命令。

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

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

这将永远循环,清除屏幕,运行命令,并等待两秒钟——基本的watch your_command实现。

您可以更进一步,创建一个可以接受your_command和sleep_duration作为参数的watch.sh脚本:

#!/bin/bash

# usage: watch.sh

while :;

do

clear

date

$1

sleep $2

done

我相信Watch只显示输出的第一个屏幕。如果你想做类似的事情,把your_command改为your_command 2>&1|head -10。

这很好,但是我更喜欢sleep ${2:-1}来选择间隔。

另外,它的echo"$(date)"相当于date?

它也不适用于管道。这里有一个改进的分叉:daniel.lubarov.com/simple-watch-script-for-osx

当输出超过一个屏幕时,不会像watch那样工作。只显示结束,而watch只显示顶部。(两者都不理想)

循环和监视之间有什么性能差异吗?

使其可执行

有趣的是:这是可行的,但是brew版本的watch只显示了一些命令的空白屏幕。

使用端口:

$sudo port install watch

没有比直接使用watch命令更好的方法了。

如果要安装它,请使用brew install watch,不要使用macports。

为什么使用BREW而不是MacPorts?

@bmauter,给每个人:stackoverflow.com/questions/21374366/…

@中心轨道,这正是我问的原因。@海林说不要使用MacPorts,但没有说明原因。watch命令是否在MacPorts中中断?

它没有坏掉。这是个糟糕的建议。MacPorts工作得很好,而且有很多包装。用它。

我从来没有从使用MacPorts中恢复过感情。它最终把我的系统搞得一团糟,我不得不重新格式化硬盘。自酿一路--我向你挑战,要找到一些流行的东西,在端口上,而不是在HB上。

上面的shell可以做到这一点,甚至可以将它们转换为别名(可能需要包装成函数来处理参数)。

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

可能"手表"不是你想要的。你可能想寻求帮助来解决你的问题,而不是实现你的解决方案!:)

如果您的真正目标是根据从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将继续跟踪日志文件,即使它被newsylog或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

不幸的是,这个shell脚本不适用于bash扩展的参数,例如:watch 2 cat*

@codecommander命令行watch 2 cat *在运行脚本之前会展开参数,因此在文件为"foo"和"bar"的目录中,每2秒运行一次cat foo bar。你期待什么样的行为?

@我只是指出,这种行为与Ubuntu上的watch命令不同。Ubuntu版本显然每两秒钟运行一次命令(每次运行时都会扩展参数),这个脚本在运行前会扩展参数,然后每两秒钟使用相同的参数运行一次。因此,如果您想查看正在添加和删除文件的目录中的文件,这个脚本没有帮助。但是,当您不使用扩展参数时,它是有用的。:)

@codecommander,我想你弄错了。bash(类似sh)扩展*,而不将其传递给运行的命令。试着在一个窗口中运行:mkdir /tmp/zz; touch /tmp/zz/foo; watch -n 2 ls -l /tmp/zz/*。在运行时,您可以在另一个窗口中执行cx1(15)。看看你的"手表"是否在第一个窗口看到了变化。我想不会的。这不适合我。这与Ubuntu与OSX或Linux与Unix无关,这是bash本身的行为。

@戈蒂,你说得对。我错了。即使使用linux watch命令,也需要使用引号:watch"ls -l /tmp/zz/*",但是如果记住使用引号,它也可以与脚本一起使用。:)

从这里回答:

bash -c 'while [ 0 ]; do ; sleep 5; done'

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

现在更容易了,即使是brew install watch。

如果Watch不想通过安装

brew install watch

还有另一个相似的/复制版本,它为我完美地安装和工作。

brew install visionmedia-watch

网址:https://github.com/tj/watch

或者,在你的~/.bashrc

function watch {

while :; do clear; date; echo; $@; sleep 2; done

}

我也有类似的问题。

当我在谷歌上搜索时,我最近发现了这个链接。这不完全是"安装软件",只是获取"watch"命令的二进制文件。

链接是osx的get watch命令

使用NIX包管理器!

安装nix,然后安装nix-env -iA nixpkgs.watch,在完成安装说明(包括在您的shell中采购."$HOME/.nix-profile/etc/profile.d/nix.sh")之后,它应该可以使用。

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

function watch {while :; do a=$($@); clear; echo"$(date)

$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

下面是这个答案的一个稍有变化的版本:

检查有效参数

在顶部显示日期和工期标题

将"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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值