web-dev-qa-db-ja.com

bashシェルを使用してコマンドを複数回実行する方法は?

コマンドを実行する方法はありますか(例:ps aux|grep someprocessn回か?

何かのようなもの:

run -n 10  'ps aux|grep someprocess'

インタラクティブに使用したいので、スクリプトを投稿しないでください。

更新:私がこれを求めている理由は、多くのマシンで作業しており、すべてのマシンに同じ機能を取得するために、すべての適応スクリプトなどをすべてのボックスにインポートしたくないということです。 =

167
mahatmanich

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!'
219
Eduardo Ivanec

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'
32
Lekensteyn

ちょうど楽しみのために

pgrep ssh ;!!;!!;!!;!!;!!;!!
25
hdaz

これを試して:

yes ls | head -n5 | bash

これには、コマンドをサブシェルで実行する必要がありますが、パフォーマンスが少し低下します。 YMMV。基本的に、「yes」コマンドを使用して、文字列「ls」をN回繰り返します。 「head -n5」は5回の繰り返しでループを終了しました。最後のパイプは、選択したシェルにコマンドを送信します。

ちなみに、cshのようなシェルにはrepeatコマンドが組み込まれています。これを使用して、bashサブシェルでコマンドを実行できます!

16
android42

以前の応答と同様ですが、forループは必要ありません。

seq 10 | xargs -I -- echo "hello"

引数またはオプションなしでseqの出力をxargsにパイプします

16
nils-holmberg

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:GNU
  • yes:GNU

移植性に飽きたら、GNU parallel

Sudo apt-get install parallel
seq 100 | parallel echo {}

コマンドを並列に実行し、多くの優れたオプションがあります。

参照: https://stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-defined-by-variables-in-bash

@ eduardo-ivanecのrun関数の魚シェル実装 上記

function run
  set number $argv[1]
  for i in (seq $number)
    eval $argv[2..-1]
  end
end
2
masukomi

それは「監視」されます-procpsを使用するほとんどすべてのUNIXシステムの一部になるはずです

システム内のfsの変更や興味深い動きを確認できます。例えば、

watch "df -hP | grep /tmp" 

コマンドを引数として置くだけです(man watch

0
Chris Arnu

MacOSではrepeatコマンドを使用できます。

repeat 10 ps aux | grep someprocess
0
Neil