Bir komut birden çok kez bash kabuğu kullanarak nasıl çalıştırılır?


153

N kez komut (örneğin ps aux|grep someprocess) çalıştırmanın bir yolu var mı ?

Gibi bir şey:

run -n 10  'ps aux|grep someprocess'

Etkileşimli olarak kullanmak istiyorum, lütfen komut dosyaları göndermeyin.

Güncelleme: Bunu sormamın nedeni, birçok makinede çalışmam ve her makinede aynı işlevselliği elde etmek için tüm komut dosyalarım vb. Her kutuya aktarmak istemiyorum.


Yanıtlar:


197

Bunun için yerleşik bir komut veya kabuk olduğunu sanmıyorum, çünkü Bourne kabuk fordöngüsünün ne için tasarlandığının önemsiz bir altkümesi ve bunun gibi bir komutu kendi başınıza uygulamak oldukça basit.

Yeni başlayanlar için sahte bir fordöngü kullanabilirsiniz :

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

Veya dizileri oluşturmak için Bash yerleşikini kullanarak, JimB'nin önerisine uygun olarak:

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

Bu yürütme on kez yinelenir commandher - bir boru ya da ayrılmış bir komutlar serisi olabilir ;ya da &&. $iHangi yinelemede bulunduğunuzu bilmek için değişkeni kullanabilirsiniz .

Bu bir astarı bir senaryo olarak kabul ederseniz ve belirtilmemiş (ancak belki de geçerli) nedenlerden dolayı istenmeyen bir sebepten dolayı, onu komut olarak, belki de .bashrc (denenmemiş) 'te bunun gibi bir şey olarak uygulayabilirsiniz:

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

Kullanımı:

run 10 command

Örnek:

run 5 echo 'Hello World!'

16
@mahatmanich, Bir döngü bir komut dosyası değil. İnteraktif bir terminalde ... ... kullanılmasını engelleyen hiçbir şey yok.
Zoredache

3
Şey, yukarıdaki tek gömlek bunu yapmanın standart yoludur ve oldukça basittir. Neden senin için iyi değil? Belki de yanlış soruyu soruyorsun? Komut dosyalarınızın veya onları birkaç kez tekrarlamak istediğiniz eylemlerinizin ana hedefi nedir? Belki de sorunu farklı bir şekilde ortaya koyarsak daha iyi bir çözüm olabilir.
Patkos Csaba

6
@mahatmanich - for olduğu dahili iterating için bash.
JimB

3
@Eduardo Ivanec - FYI, bash gibi bir yerleşik ürün yelpazesine sahiptir seq: {1..10}
JimB

1
Yerleşik braket dizisinin değişken ikameyi desteklemediği görülüyor (bkz. Stackoverflow.com/a/3737773/713554 ). Yerleştirildiğinde Verdiğin fonksiyon mükemmel çalışıyor .bashrceğer {1..$number} takas edilir `seq $number`olsa.
Leo

29

ps aux | grep someprocessBir programın değişikliklerini sabit bir süre boyunca izlemek istediğinize benziyor. Eduardo, sorunuzu tam olarak cevaplayan bir cevap verdi ancak bir alternatifi var watch:

watch 'ps aux | grep someprocess'

Kabuğun komutu "run watch ps aux" olarak yorumlamasını engellemek ve sonucu iletmek için komutu tek tırnak işaretleri içine aldığımı unutmayın grep someprocess. Önceki komutu yapmanın başka bir yolu:

watch ps aux \| grep someprocess

Varsayılan olarak, seçenek watchkullanılarak değiştirilebilir, her iki saniyede bir yenilenir -n. Örneğin, 1 saniye aralığa sahip olmak istiyorsanız:

watch -n 1 'ps aux | grep someprocess'

21

Sadece eğlence için

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

Birisi bunu açıklayabilir mi? Çok ilgi çekici görünüyor.
Daniel Vartanov

4
; sadece komut ayırıcı. !! bash'daki son komutu tekrar et. Böylece bu 'pgrep ssh' komutunu çalıştırın ve 6 kez tekrarlayın.
Piotr Kukielka 21:14

Bu öğretici olsa da sezgisel değildir. Tek astar for, en iyi yol gibi görünüyor. Neyse, cevap için teşekkürler.
erm3nda

1
cmd ;!!Bir satırda geçerli satırdan önce girilen komutu tekrar etmiyor musunuz? İki ayrı historygiriş olmalı .
Joel Purra

ilk başarısızlıkta durmak için ;ile değiştirin &&.
user881300

16

önceki yanıtlara benzer, ancak for döngüsü gerektirmez:

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

seq 'in argüman veya seçeneksiz xargs boru çıkışı


2
Bu sadece bir işlem yapacak echo "hello" 1 2 3 4 5 6 7 8 9 10. -n 1Her giriş için bir işlemle (sayı) ve -P 10paralel çalıştırma ile (10 paralel işlem) xargs çalıştırmanız gerekir . İle bitiyor seq 10 | xargs -n 1 -P 10 echo.
Alexander Klimetschek

16

Bunu dene:

yes ls | head -n5 | bash

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

Tesadüfen benzer cshkabukları yerleşik bir repeatkomut var. Bunu komutunuzu bir bash alt kabuğunda çalıştırmak için kullanabilirsiniz!


5

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

tabii ki tek bir astarın içine yapılabilecekler:

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

ve en taşınabilir yol gibi görünmektedir ve bu nedenle programları kurmanız daha az olasıdır.

Aşağıdakiler daha az taşınabilir:

  • ayraç genişletme {1..10}: bash özgü ve bağımsız değişken büyükse büyük bir çizgi oluşturur
  • seq: GNU
  • yes: GNU

Taşınabilirlikten bıktıysanız, GNU’yu düşünün parallel:

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

paralel komutları çalıştıran ve birçok harika seçeneğe sahip.

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


GNU Parallel taşınabilir olması için üretildi. sh, zsh, kshve bashçoğu platformda hepsi iyi desteklenir. csh, tcsh, fishbiraz desteği var. Kullanılması parallel --embedbile kolayca GNU Paralel yüklü olmayan başka bir sisteme taşınabilir bir komut dosyası oluşturabilirsiniz.
Ole Tange

2

@ Eduardo-ivanec'in yukarıdakirun fonksiyonunun bir balık kabuğu uygulaması

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

0

Bu 'seyret' olurdu - procps kullanan hemen hemen her unix sisteminin bir parçası olmalı

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

watch "df -hP | grep /tmp" 

Sadece komutlarınızı bir argüman olarak koyun (bkz. man watch)


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

0

MacOS'ta bu repeatkomutu kullanabilirsiniz .

repeat 10 ps aux | grep someprocess
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.