コマンドを実行する方法はありますか(例:ps aux|grep someprocess
)n回か?
何かのようなもの:
run -n 10 'ps aux|grep someprocess'
インタラクティブに使用したいので、スクリプトを投稿しないでください。
更新:私がこれを求めている理由は、多くのマシンで作業しており、すべてのマシンに同じ機能を取得するために、すべての適応スクリプトなどをすべてのボックスにインポートしたくないということです。 =
Bourne Shell for
ループが設計されたものの自明なサブセットであり、このようなコマンドを自分で実装することは非常に簡単であるため、コマンドまたはこれに組み込まれたシェルは存在しないと思います。
まず、ダミーのfor
ループを使用できます。
for i in `seq 10`; do command; done
または、JimBの提案に従って、シーケンスを生成するためにBashビルトインを使用します。
for i in {1..10}; do command; done
これは、毎回command
を実行して10回繰り返されます。;
または&&
で区切られたパイプまたは一連のコマンドを使用できます。 $i
変数を使用して、現在の反復を確認できます。
この1行のスクリプトをスクリプトなどと考える場合、不特定の(しかしおそらく有効な)理由で望ましくない理由で、コマンドとして次のように実装できます。
#function run
run() {
number=$1
shift
for i in `seq $number`; do
$@
done
}
使用法:
run 10 command
例:
run 5 echo 'Hello World!'
ps aux | grep someprocess
は、プログラムの変更を一定時間監視したいようです。エドゥアルドはあなたの質問に正確に答える答えを出しましたが、代替案があります: watch
:
watch 'ps aux | grep someprocess'
シェルがコマンドを「run watch ps aux」と解釈しないようにコマンドを一重引用符で囲み、grep someprocess
を介して結果をパイプ処理していることに注意してください。前のコマンドを実行する別の方法は次のとおりです。
watch ps aux \| grep someprocess
デフォルトでは、watch
は2秒ごとに更新され、-n
オプションを使用して変更できます。たとえば、間隔を1秒にしたい場合:
watch -n 1 'ps aux | grep someprocess'
ちょうど楽しみのために
pgrep ssh ;!!;!!;!!;!!;!!;!!
これを試して:
yes ls | head -n5 | bash
これには、コマンドをサブシェルで実行する必要がありますが、パフォーマンスが少し低下します。 YMMV。基本的に、「yes」コマンドを使用して、文字列「ls」をN回繰り返します。 「head -n5」は5回の繰り返しでループを終了しました。最後のパイプは、選択したシェルにコマンドを送信します。
ちなみに、csh
のようなシェルにはrepeat
コマンドが組み込まれています。これを使用して、bashサブシェルでコマンドを実行できます!
以前の応答と同様ですが、forループは必要ありません。
seq 10 | xargs -I -- echo "hello"
引数またはオプションなしでseqの出力をxargsにパイプします
POSIX方法
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01
x=10
while [ $x -gt 0 ]; do
command
x=$(($x-1))
done
もちろんこれをワンライナーにすることもできます。
x=10; while [ $x -gt 0 ]; do command; x=$(($x-1)); done
最も移植性の高い方法のようで、プログラムをインストールする可能性は低くなります。
以下は移植性が低いです:
{1..10}
:bash固有で、引数が大きい場合は巨大な行が生成されますseq
:GNUyes
:GNU移植性に飽きたら、GNU parallel
:
Sudo apt-get install parallel
seq 100 | parallel echo {}
コマンドを並列に実行し、多くの優れたオプションがあります。
@ eduardo-ivanecのrun
関数の魚シェル実装 上記
function run
set number $argv[1]
for i in (seq $number)
eval $argv[2..-1]
end
end
それは「監視」されます-procpsを使用するほとんどすべてのUNIXシステムの一部になるはずです
システム内のfsの変更や興味深い動きを確認できます。例えば、
watch "df -hP | grep /tmp"
コマンドを引数として置くだけです(man watch
)
MacOSではrepeat
コマンドを使用できます。
repeat 10 ps aux | grep someprocess