命令字符串中带有分号的“repeat”语法?

命令字符串中带有分号的“repeat”语法?

我正在使用输出作业当前状态的脚本来监视 FreeBSD 中的进程。

使用csh内置命令repeat,我想每 2 秒运行一次脚本,所以我天真地想做这样的事情:

  • repeat 100000 ./dumpstatus ; sleep 2

显然分号不会按预期工作,但我找不到包含它的正确语法。

我可以通过在以下位置调用新的 shell 实例来解决此问题repeat

  • repeat 100000 sh -c 'path/to/script/dumpstatus ; sleep 2'

但这并不理想,而且pwd也没有从当前的路径中走出来,这很烦人:)

我也尝试过repeat 10000 ( ./dumpstatus ; sleep 2)使用或不使用转义括号,这也不起作用,我也不完全确定为什么。

在不调用的情况下执行此操作的正确方法是什么sh -c,以便分号被解释为我希望的那样?

答案1

我相信不调用 shell 是不可能的,正如 csh 手册页所述(部分):

重复计数命令

指定的命令与上面一行 if 语句中的命令受到相同的限制,被执行 count 次。 ...

结合if描述:

如果 (表达式命令

...命令必须是一个简单命令,不能是别名、管道、命令列表或带括号的命令列表,但它可以有参数。

...在我看来排除了其他选择。

我无法在示例中重现您的 $PWD 故障sh -c。在我的主目录中给出这个脚本:

$ cat ~/script.sh
#!/bin/sh
echo $0 pwd is $PWD

以及一个示例运行:

$ csh
$ echo $version
tcsh 6.18.01 (Astron) 2012-02-14 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,color,filec

$ cd /tmp
$ repeat 2 sh -c '~/script.sh; sleep 2'
/home/me/script.sh pwd is /tmp
/home/me/script.sh pwd is /tmp

...显示 script.sh 从父 shell 的 $PWD 执行。

答案2

由于repeat无法解析命令列表,因此无法完成。我希望csh man可以这样直白地说:

 repeat count command
         The specified command must be a simple command, (not a pipeline, not a
         command list, nor a parenthesized command list), and is executed count
         times.  I/O redirections occur exactly once, even if count is 0.

请注意单个重定向限制,这使得使用while循环解决方法变得不切实际。示例,不打印 9 条生命:

echo lives | repeat 9 cat | wc -l
1

来源: 的实际引用man csh(但先阅读条目repeat,然后if阅读条目)有点迂回:

COLUMNS=90 man csh | egrep -A 7 ' (repeat|if).*and$' | sed -n '1,13{s/^ \{10\}//p}'
 if (expr) command
         If the specified expression evaluates to true, then the single
         command with arguments is executed.  Variable substitution on
         command happens early, at the same time it does for the rest of the
         if command.  command must be a simple command, not a pipeline, a
         command list, or a parenthesized command list.  Input/output redi‐
         rection occurs even if expr is false, i.e., when command is not exe‐
         cuted (this is a bug).
 repeat count command
         The specified command, which is subject to the same restrictions as
         the command in the one line if statement above, is executed count
         times.  I/O redirections occur exactly once, even if count is 0.

相关内容