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

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

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

おすすめ記事