ジョブの現在の状態を出力するスクリプトを使用して、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のマニュアルページに(部分的に)指定されているように、シェルを呼び出さなければ不可能だと思います。
繰り返す計算コマンド
指定されたコマンドには、上記の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.