Bash'de bittiğinde bir komutu sürekli olarak yeniden çalıştır


62

Herhangi bir nedenden ötürü bir komut bittiğinde, bir komutu tekrar çalıştırmanın basit bir yolunu bulmaya çalışıyorum (hata ya da başka bir şekilde).

Buna yaklaşmanın en iyi yolu ne olabilir?

EDIT: Daha önce yeterince net değildim. Önceki işlem bitene kadar beklemek için bir sonraki uygulamaya ihtiyacım var .

2 EDIT: Neredeyse tüm cevaplar harika çalışıyor. Yanlışlıkla cevapların çoğunun ya süreci istifade edeceğini ya da istenmediği zaman sadece bir kez daha uygulayacağını düşündüm.

linux  bash 

1
Hala net değilsin. Hangi programı yürüttüğünden bahsetmen yardımcı olurdu.
Daniel Beck

1
-1 Kullanıcı, cevapların aslında önerdiği şeyi yapmaya çalışmak yerine işe yaramadığını belirtti. Bu soru herhangi bir araştırma çabası göstermiyor.
Daniel Beck

Yanıtlar:


39

Bu, commandtekrar tekrar yürüterek sonsuz bir döngü oluşturur .

while :
    do
        command
done

Lütfen asıl sorunun düzenlemesine bakın. Sadece bir kez değil tekrar tekrar çalıştırmaya devam etmem gerekiyor.

8
@calcifer Bu cevap oldukça iyi çalışıyor. Programınızla ilgili olağandışı bir şey var, şimdiye kadar yanıtlayan dört kullanıcıdan hiçbiri beklenmiyor ve sizden bahsetmediniz.
Daniel Beck

@calcifer bu sonsuz bir döngüdür. zamanın sonuna kadar tekrar eder (senaryo zaten sonlandırılıncaya kadar)
Nate Koppenhaver

1
Benim hatam, bunun (ve tüm diğer cevapların) ya süreci istifade edeceğini ya da sadece bir kez daha uygulayacağını sanmıyorum. Yani evet, bu cevap çalışıyor. Teşekkürler.

1
tek satır sürümü:, cyberciti.biz/faq/bash-infinite-loopwhile true; do echo 'Hit CTRL+C'; sleep 1; done sayesinde
jk2K 11:18

107

watchKomut Belirtilen ara ile sonsuza bir komut tekrar edecektir:

watch -n0 <command>

-nSıfıra ayarlama , aralığı hiçbir şeyde etkin bir şekilde ortaya çıkarmaz (bence gerçekten 0,1 saniyedir).

watch ayrıca çıktıyı hizalamanın ek faydaları da vardır, böylece görsel değişiklikler kolayca görülebilir ve son dönemdeki değişiklikleri vurgulamak için bir anahtar bulunur.

Referans: bekçi sayfası :

saat, komutu tekrar tekrar çalıştırır ve çıktısını gösterir (ilk ekran görüntüsü). Bu programın zaman içindeki değişimini izlemenizi sağlar. Varsayılan olarak, program her 2 saniyede bir çalıştırılır; Farklı bir aralık belirtmek için -n veya --interval komutunu kullanın.

saat yarıda kesilene kadar çalışacaktır.


Lütfen asıl sorunun düzenlemesine bakın.

6
Şimdiye kadarki cevapların tümü, bunun da içinde olduğu gibi. Linux özellikle istemediğiniz sürece çatallaşmayacak.
Paul

Bunu çataldan haberim yoktu, teşekkürler.

Bu yöntemi kullanarak herhangi bir çıktı göremiyorum.
Raffi Khatchadourian

@RaffiKhatchadourian watch lsDosyaları içeren bir dizinde yaparsanız, hiçbir şey alamadığınızı mı söylüyorsunuz ?
Paul

17

Basit bir çözüm şöyle olurdu:

yourcommand; !#

;komutları ayırır, tek bir satırda birden fazla komuta izin verir ( Bash: Listeler )

!#bash'a "şu ana kadar yazdığım her şeyi tekrar et" demişti ( Bash: Event-Designators )


1
Üzgünüm, yeterince açık değildim. Sadece bir kez değil tekrar tekrar çalıştırmaya devam etmem gerekiyor.

Bunun için teşekkürler, ben onu arıyordum, özellikle yourcommand; !!aslında aynı satırdaki komutlarla çalışmadığı için, bunun !#gibi görünüyor. Şerefe!
sdaau

; !#
ZSH

7

Komut yürütme sırasında önceden planlayabilirsiniz (etkileşimli olmasa da) ve !!hangisinin önceki komutu yerine getireceğini girebilirsiniz . Bu örneğin sırasında çalışır ping -c 5.


Ayrıca bir işlevi tanımlayabilirsiniz bash:

function repeat { "$@"; "$@"; }

Sürdürmek için saklayın ~/.bashrc.

Ardından, komutunuzu şöyle çalıştırabilirsiniz:

repeat ping -c5 heise.de

Tekrar tekrar yürütmek istediğiniz (ve örneğin herhangi bir komutun olmadığı ) belirli bir komut ise "$@", bu snippet'te gerçek komutunuzla değiştirebilir ve örneğin repeat_pingyerine bunun yerine fonksiyonun adını kullanabilirsiniz .


Sonsuz bir döngü yapmak için @Dennis'in önerdiği şeyi yapabilirsiniz. Bunu etkileşimli bir kabukta kullanmayı düşünüyorsanız, buna benzer bir bekleme süresi eklemenizi öneririz:

function repeat { while 1 ; do "$@" ; sleep 1 ; done; }

Aksi halde, bu sonsuz döngüyü kullanarak iptal etmek oldukça zordur Ctrl-Z.


Lütfen asıl sorunun düzenlemesine bakın.

6
@calcifer Bu yürütmeler program çağrısı geri gelene kadar bekler. Programınız kabuktan ayrılıyor ve çıkmadan geri dönüyor mu?
Daniel Beck

Benim hatam, bunun (ve tüm diğer cevapların) ya süreci istifade edeceğini ya da sadece bir kez daha uygulayacağını sanmıyorum. Yani evet, bu cevap çalışıyor. Teşekkürler.

4

Bir whiledöngü aşağıdaki gibi bir boolean koşulu verin :

#!/bin/bash

while true; do

    do_something && wait

done

Bu, bash işlemi sonlandırmak için bir sinyal alana kadar tekrar tekrar yürütülür. Genellikle şeklinde ctrl+c.

watchKomutu, art arda da bir betiği çalıştırmak için de kullanabilirsiniz . Örneğin, bash terminalinizde basit bir saat kullanmak watchşuna benzeyebilir:

$ watch -t -n1 date +%T

-tSeçenek söyler watchÇalışıyorsa sürecin bir başlık bilgisi gelmiyordu. Bu size yalnızca tekrarlanan komutun temiz çıktısını verir. -n1Seçeneği her tekrarlamak izlemek söyler nsaniye. Bu durumda, ikinci -n1aralıklarla olacaktır 1. Ardından date +%Tkomut, komutun tamamlandığı zamandaki zamanı gösterir. Bu komutu yapmak size terminalinizde aktif bir saat verecektir.

Ve sonra diğer cevapların hiçbirinde olmayan bir yöntem daha sonsuz bir işlev çağrısı olacaktır.

do_something() { do_something }; do_something && wait

Bu aslında whilesadece özyinelemeli fonksiyon çağrıları kullanan boolean döngü ile aynıdır .

(düzenleme) Makinenizin kaynaklarını göz önünde bulundurarak, && waitbir işlem her çalıştırıldığında, döngüler bir sonraki yinelemeden önce çıkış 0 ile bitinceye kadar "bekleyecek" ekledim . Bu etkileşimli bir kabuk betiğinde kullanışlıdır.


1
Bir whiledöngü örneği var, ancak bir boolean truesözdizimi kullanmıyor . Bir watchörnek var, ancak pek çok faydalı sözdizimi vermiyor. Bunlara yardım edebilecekleri için bu konuda açıklama yapıyorum. Bunlara pratik fayda sağlamak istedim. whileDöngü boole da olabilir falseve bir yanlış koşul yerine getirilene kadar yürütmüyor. Bu oldukça kullanışlı.

1
@ Spittin'IT Size kolaylık sağlamak için diğer cevaplarda kullanılmayan bir yöntem eklendi.

Yeterince adil ve anlıyorum ... Ben sadece inceleme modülü gitti ama güzel düzenleme ve takip gibi yorum yapıyordum!
Pezevenk Suyu BT 23

ifYeniden yürütmeye nasıl devam eder?
Kamil Maciorowski

İyi nokta Kamil. Özyinelemeli lol yapmak unuttum. ifAçıklamada kendini çağıran bir işlev kullanılarak yapılan düzenleme düzeltildi .

0

Bu, bash'de bir komutu tekrarlamak için kullandığım başka bir yöntemdir. Bu, bir senaryo yazmayı içermediğinden ve pek çok kişi tarafından bilindiği için bazılarına saçma gelebilir. Ancak hatırlanması gereken çok sözdizimi olmadığı için hızlı ve başlangıç ​​dostu olduğu için bahsetmeye değer olduğunu düşünüyorum. Bunu sadece Ubuntu’nun gnome terminalinde test ettim ve diğer terminaller bunu desteklemeyebilir.

  1. Komutu terminalde bir kez girin.
  2. Fare ile yeni satır karakterini içeren komutu seçin.
  3. Seçimi Ctrl-Insert veya içerik menüsünü kullanarak kopyalayın (genellikle sağ tıklamayla erişilir).
  4. Komutu çalıştırmak istediğiniz kadar yapıştırmak için Shift-Insert tuşunu kullanın.

Her komut bitene kadar yapıştırmak için beklemeniz gerekmez. Yapıştırılan komutlar bir kuyruğa girer ve birbiri ardına çalıştırılır.


0

Bugün kibirli hissediyorum.

Sonsuz akışlardan birinden okuyun ve xargs

cat /dev/zero | xargs --null echo hello there

İçeriye biraz mola vermeniz gerekirse, muhtemelen idam etmeniz gerekecektir. sh

cat /dev/zero | xargs --null sh -c "echo hello there && sleep 3"
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.