Soru Bir komut, bash kabuk kullanarak, birden çok kez nasıl çalıştırılır?


Bir komutu çalıştırma yolu var mı (ör. ps aux|grep someprocess) için n zamanlar?

Gibi bir şey:

run -n 10  'ps aux|grep someprocess'

Ben etkileşimli kullanmak istiyorum, lütfen komut dosyaları göndermeyin.

Güncelleme: Bunu sormamın nedeni, çok sayıda makinede çalışıyorum ve tüm makinelere aynı işlevselliği elde etmek için tüm adaped scriptlerimi her kutuya aktarmak istemiyorum.


132
2018-05-24 15:55


Menşei


Mükemmel cevap, bir tane bile almayan soruya çok fazla vesile olsun. Hadi bunu +1 değiştirelim :) - Lekensteyn
@Lekensteyn teşekkürler - mahatmanich
stackoverflow.com/questions/3737740/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


Cevaplar:


Bunun için bir komut ya da kabuk olduğunu düşünmüyorum, çünkü Bourne kabuğunun önemsiz bir alt kümesidir for Döngü bu gibi bir komut için tasarlanmış ve uygulanmıştır bu nedenle oldukça basittir.

Yeni başlayanlar için bir kukla kullanabilirsiniz for döngü:

for i in `seq 10`; do command; done

Veya JimB'nin önerisine göre, dizileri oluşturmak için Bash yerleşimini kullanarak eşdeğer olarak:

for i in {1..10}; do command; done

Bu, on kez yürütme işlemini yineler command her seferinde - bir boru veya ayrılan bir dizi komut olabilir ; veya &&. Kullanabilirsiniz $i hangi yineleme yaptığınızı bilmek için değişken.

Bu tek-liner'i bir senaryonun ve bazı tanımlanmamış (ama belki de geçerli) bir nedenin göz ardı edilemez bir şekilde kabul ederseniz, bunu bir komut olarak yapabilirsiniz. Belki de bu gibi bir şey .bashrc (test edilmemiş):

#function run
run() {
    number=$1
    shift
    for i in `seq $number`; do
      $@
    done
}

Kullanımı:

run 10 command

Örnek:

run 5 echo 'Hello World!'

171
2018-05-24 15:57



@mahatmanich, Bir döngü bir senaryo değildir. Etkileşimli bir terminalde kullanmanızın engellenmesinde hiçbir şey yok. - Zoredache
Peki, yukarıdaki tek liner bunu yapmak için standart bir yoldur ve oldukça basittir. Neden senin için iyi değil? Belki yanlış soruyu soruyorsun? Komut dosyalarınızın ana amacı nedir veya birkaç kez tekrarlamak istediğiniz eylemleriniz nelerdir? Belki de sorunu farklı bir şekilde ortaya koyarsak daha iyi bir çözüm vardır. - Patkos Csaba
@mahatmanich - for  olduğu yinelenen için bash yerleşik. - JimB
@Eduardo Ivanec - FYI, bash gibi yerleşik menzili vardır seq: {1..10} - JimB
Dahili destek dizisi değişken değiştirme işlemini desteklemiyor gibi görünüyor (bkz. stackoverflow.com/a/3737773/713554). Verdiğiniz işlev, yerleştirildiğinde mükemmel çalışır .bashrc Eğer {1..$number} ile değiştirilir `seq $number` gerçi. - Leo


ps aux | grep someprocess Sabit bir süre için bir programın değişikliklerini izlemek istediğiniz gibi görünüyor. Eduardo soruna tam olarak cevap veren bir cevap verdi ama bir alternatif var: watch:

watch 'ps aux | grep someprocess'

Komutu, komutun komutu "çalma ps aux" olarak yorumlamasını önlemek için komutu tek tırnak içine koyduğumu ve sonucu grep someprocess. Önceki komutu yapmanın başka bir yolu:

watch ps aux \| grep someprocess

Varsayılan olarak, watch kullanarak her iki saniyede bir yeniler, -n seçeneği. Örneğin, 1 saniyelik bir aralığa sahip olmak istiyorsanız:

watch -n 1 'ps aux | grep someprocess'

29
2018-05-26 15:07



Evet bu bir çekicilik gibi çalışır. - Jānis Gruzis


Sadece eğlence için

pgrep ssh ;!!;!!;!!;!!;!!;!!

21
2018-06-27 13:04



Birisi bunu açıklayabilir mi lütfen? Çok ilgi çekici görünüyor. - Daniel Vartanov
; sadece komut ayırıcıdır. !! bash içinde son komutu tekrar oynat. Yani bu 'pgrep ssh' çalıştırın ve 6 kez tekrarlayın. - Piotr Kukielka
Bu öğretici olsa da sezgisel değildir. Tek astar for en iyi yol gibi görünüyor. Her neyse cevap için teşekkürler. - erm3nda
Alışkanlık cmd ;!! bir satırda sadece girilen komutu tekrarla önce mevcut hat? İki ayrı olmalı. history girdileri. - Joel Purra


Bunu dene:

yes ls | head -n5 | bash

Bu, bir alt kabukta çalıştırılacak komutu gerektirir, hafif bir performans cezası. YMMV. Temel olarak, "ls" N kere tekrarlamak için "evet" komutunu alırsınız; "kafa -n5" ise 5 tekrarda döngüyü sonlandırdı. Son boru, komutu seçtiğiniz kabuklara gönderir.

tesadüfen csh-yerinde kabuklar yerleşik repeat Komut. Komutunu bir bash alt kabuğunda çalıştırmak için bunu kullanabilirsin!


14
2018-01-31 00:04





önceki cevaplara benzer, ancak döngü gerektirmez:

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

argüman veya seçenek olmaksızın sekansın xargs için boru çıkışı


11
2017-11-18 14:36



Bu sadece bir yürütme yapacak echo "hello" 1 2 3 4 5 6 7 8 9 10. İle xargs çalıştırmanız gerekir -n 1 her giriş için bir sayı (sayı) ve ile -P 10 Paralel yürütme için (10 paralel süreç). İle biten seq 10 | xargs -n 1 -P 10 echo. - Alexander Klimetschek


POSIX yolu

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

Elbette ki tek bir astar haline getirilebilir:

x=10; while [ $x -gt 0 ]; do command; x=$(($x-1)); done

ve en portatif yol gibi görünüyor ve bu yüzden programları yüklemenizi daha az olasıdır.

Aşağıdakiler daha az portatiftir:

  • brace genişleme {1..10}: bash spesifik ve argüman büyükse büyük bir çizgi oluşturur
  • seq: GNU
  • yes: GNU

Ve eğer taşınabilirlikten sıkılırsanız, GNU'yu düşünün. parallel:

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

hangi komutları paralel olarak çalıştırır ve birçok seçenek vardır.

Ayrıca bakınız: https://stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-defined-by-variables-in-bash


4
2018-06-15 09:39





@ Eduardo-ivanec'in bir balık kabuğu uygulaması run fonksiyon yukarıdaki

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

2
2018-06-20 18:44





Bu 'izle' olurdu - procps kullanarak neredeyse her unix sisteminin bir parçası olmalı

Bir sistemde fs değişikliklerini veya başka bir şekilde ilginç hareketi görebilirsiniz. Örneğin,

watch "df -hP | grep /tmp" 

Sadece komutlarınızı argüman olarak yazınız. man watch)


0



Saatin bir cevabı zaten var ... aşağıya bakın ... - mahatmanich