使用 'watch' 的 Bash 脚本失败。为什么?

use*_*307 4 bash scripts

我需要从终端重复(每 3600 秒)运行以下命令:

if whois abcxyz.com | grep -q 'string'; then
    echo 'Message line 1'
    echo 'Message line 2'
fi
Run Code Online (Sandbox Code Playgroud)

我尝试使用手表,如下所示:

watch -n 3600 if whois abcxyz.com | grep -q 'string'; then
    echo 'Message line 1'
    echo 'Message line 2'
fi
Run Code Online (Sandbox Code Playgroud)

但我收到错误消息。

你能帮我让它工作吗?

谢谢

ste*_*ver 13

由于默认watch [options] command执行commandusing sh -c,您可以直接使用它运行 shell 代码片段,前提是:

  1. 你得到了正确的引用

  1. 您的代码与 sh 兼容,即不使用任何 bash/zsh/csh-"isms"

所以例如

$ watch -n 36 'if whois abcxyz.com | grep -q "string"; then
  echo "Message line 1" | ts
  echo "Message line 2" | ts
fi'
Run Code Online (Sandbox Code Playgroud)

  • 而不是查看您的示例的`watch [options] command` 语法,也许语法应该类似于`watch [options] 'command'` 以*强调*命令需要引用的事实。+1虽然很好的答案。 (2认同)

wal*_*tor 9

watch记录(在man watch)为:

watch [options] command
Run Code Online (Sandbox Code Playgroud)

它需要一个简单的命令,而不是一个完整的命令表达式,
因此,您必须将命令包装在bash脚本中,然后watch

例如,

$HOME/bin/foo

#!/bin/bash
if whois abcxyz.com | grep -q 'string'; then
    echo 'Message line 1'
else
    echo 'Message line 2'
fi
Run Code Online (Sandbox Code Playgroud)

然后,在使foo可执行文件后chmod +x $HOME/bin/foo

watch -n 3600 $HOME/bin/foo
Run Code Online (Sandbox Code Playgroud)