コマンド文字列にセミコロンを含む「繰り返し」構文はありますか?

コマンド文字列にセミコロンを含む「繰り返し」構文はありますか?

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

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

  • 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のマニュアルページに(部分的に)指定されているように、シェルを呼び出さなければ不可能だと思います。

繰り返す計算コマンド

指定されたコマンドには、上記のif文のコマンドと同じ制限が適用され、回数だけ実行されます。 ...

結合された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.

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.

関連情報