ジョブの現在の状態を出力するスクリプトを使用して、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 を表示します。