コマンド文字列にセミコロンが含まれる `repeat` の構文は?

コマンド文字列にセミコロンが含まれる `repeat` の構文は?

ジョブの現在のステータスを出力するスクリプトを使用して、FreeBSD 内のプロセスを監視しています。

csh組み込みコマンドを使用してrepeat、スクリプトを 2 秒ごとに実行したいので、次のようにします。

  • repeat 100000 ./dumpstatus ; sleep 2

明らかにセミコロンは意図したとおりに機能しませんが、それを含める正しい構文が見つかりません。

以下の新しいシェル インスタンスを呼び出すことで回避できますrepeat

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

しかし、それは理想的とは言えず、現在の経路をたどることもないのでpwd、面倒です :)

括弧をエスケープする場合としない場合の両方を試しましたがrepeat 10000 ( ./dumpstatus ; sleep 2)、それでもうまくいかず、その理由はよくわかりません。

sh -cを呼び出さずにセミコロンが希望どおりに解釈されるようにするには、これを行う正しい方法は何ですか?

答え1

csh のマニュアルページ (一部) に記載されているように、シェルを呼び出さずにこれを行うことはできないと思います。

繰り返すカウントコマンド

指定されたコマンドは、上記の 1 行の 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

... 親シェルの $PWD から実行されている script.sh を示します。

答え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.

リダイレクトの制限が 1 つしかないため、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.

関連情報