Bashで終了したコマンドを継続的に再実行する


62

何らかの理由(エラーなど)でコマンドが終了するたびにコマンドを再実行し続ける簡単な方法を見つけようとしています。

これにアプローチする最良の方法は何でしょうか?

編集:私は前に十分に明確ではなかった。前の実行が終了するまで、次の実行を待つ必要があります。

編集2:ほとんどすべての答えがうまく機能します。私は、ほとんどの答えがプロセスを分岐するか、一度だけ再実行するかのいずれかが間違っていると思っていました。

linux  bash 

1
あなたはまだ明確ではありません。実行しているプログラムに言及した場合に役立ちます。
ダニエルベック

1
-1この質問は、ユーザーが提案したことを実際に実行しようとする代わりに回答が機能しなかったとコメントしたため、調査努力を示しません。
ダニエルベック

回答:


39

これにより、無限ループが作成され、繰り返し実行さcommandれます。

while :
    do
        command
done

元の質問の編集をご覧ください。一度だけではなく、何度も何度も再実行する必要があります。

8
@calciferこの答えは非常にうまくいきます。あなたのプログラムについて、これまでに答えた4人のユーザーの誰も予想しなかった、あなたがそれについて言及しなかったという異常なことがあります。
ダニエルベック

@calciferこれは無限ループです。それは時間の終わりまで(まあ、とにかくスクリプトが終了するまで)
繰り返されます

1
私の悪いことに、私はこれ(および他のすべての答え)がプロセスを分岐するか、一度だけ再実行するか、どちらも望んでいないと思った。はい、この答えは機能します。ありがとう。

1
1行バージョン:while true; do echo 'Hit CTRL+C'; sleep 1; donecyberciti.biz
faq /

107

watchコマンドは、指定した間隔で永遠にコマンドを繰り返します。

watch -n0 <command>

-nゼロに設定すると、間隔は事実上ゼロになります(実際には.1秒だと思います)。

watch また、出力を調整して視覚的な変更を簡単に確認できるという利点があり、前回の実行からの変更を強調表示するスイッチがあります。

参照:ウォッチのmanページ

watchはコマンドを繰り返し実行し、その出力を表示します(最初の画面いっぱい)。これにより、プログラム出力の経時変化を見ることができます。デフォルトでは、プログラムは2秒ごとに実行されます。-nまたは--intervalを使用して、異なる間隔を指定します。

監視は中断されるまで実行されます。


元の質問の編集をご覧ください。

6
これを含むこれまでのすべての答えはこれを行います。Linuxは、特に指定しない限り分岐しません。
ポール

フォークについては知りませんでした、ありがとう。

この方法を使用しても出力が表示されません。
ラフィカッチャドゥリアン16年

@RaffiKhatchadourian watch lsファイルを含むディレクトリで実行しても、何も得られないと言っていますか?
ポール

17

簡単な解決策は次のとおりです。

yourcommand; !#

;コマンドを分離し、1行に複数のコマンドを許可します(Bash:Lists

!#bashに「これまでにこの行で書いたすべてを繰り返す」ように指示します(Bash:Event-Designators


1
申し訳ありませんが、十分に明確ではありませんでした。一度だけではなく、何度も何度も再実行する必要があります。

このおかげで、私はそれを探していました、特にyourcommand; !!同じ行のコマンドで実際に動作しないので、それがうまくいく!#ようです。乾杯!
sdaau

; !#ZSHで動作しませんでした。基本的にそれを複製するステートメントを拡張するだけで、トリガーしません
18年

7

コマンド実行中に事前に計画を立てて(インタラクティブでない場合)!!、前のコマンドを再度実行するコマンドを入力できます。これは、例えばの間に機能しping -c 5ます。


以下で関数を定義することもできますbash

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

永続化するには、に保存し~/.bashrcます。

その後、次のようにコマンドを実行できます。

repeat ping -c5 heise.de

それはあなたが繰り返し(例えばなく実行したい特定のコマンドの場合は任意のコマンドを)、あなたは置き換えることができ"$@"、あなたの実際のコマンドでそのスニペットに、関数などに名前を付けるrepeat_ping代わりに。


無限ループにするために、@ Dennisが提案することを実行できます。次のように対話型シェルでこれを使用する場合は、待機期間を追加することをお勧めします。

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

それ以外の場合、を使用してこの無限ループを中止するのはかなり不便Ctrl-Zです。


元の質問の編集をご覧ください。

6
@calciferこれらの実行は、プログラム呼び出しが戻るまで待機します。プログラムはシェルから切り離され、終了する前に戻りますか?
ダニエルベック

私の悪いことに、私はこれ(および他のすべての答え)がプロセスを分岐するか、一度だけ再実行するか、どちらも望んでいないと思った。はい、この答えは機能します。ありがとう。

4

whileループに次のようなブール条件を与えます。

#!/bin/bash

while true; do

    do_something && wait

done

これは、bashがプロセスを終了する信号を受け取るまで繰り返し実行されます。通常の形式ctrl+c

このwatchコマンドを使用して、スクリプトを繰り返し実行することもできます。たとえば、使用しているbashターミナルの単純な時計は次のwatchようになります。

$ watch -t -n1 date +%T

この-tオプションはwatch、実行中のプロセスのタイトルを表示しないように指示します。これにより、繰り返されているコマンドのみのクリーンな出力が得られます。この-n1オプションは、ウォッチに1 n秒ごとに繰り返すよう指示します。この場合、秒の-n1間隔になります1。その後、date +%Tコマンドはコマンド完了時の時刻を表示します。このコマンドを実行すると、ターミナルにアクティブなクロックが表示されます。

そして、他の答えのいずれにも含まれていないもう1つのメソッドは、無限関数呼び出しです。

do_something() { do_something }; do_something && wait

これは基本的に、while再帰的な関数呼び出しのみを使用するブールループと同じです。

(編集)マシンのリソースを念頭に置いて、&& waitプロセスが実行されるたびに、次の反復の前にプロセスが終了ステータス0で終了するまでループが「待機」するように追加しました。これは、対話型のシェルスクリプトで役立ちます。


1
whileループの例がありますが、ブールtrue構文を使用していません。watch例はありますが、多くの便利な構文を提供していません。私は、それが役立つかもしれない人のために、これらについて説明しています。これらに実用的な有用性を与えたいと思いました。whileループブールも可能falseと虚偽の条件が満たされるまで実行されません。とても便利です。

1
@ Spittin'IT便宜上、他の回答では使用されないメソッドを追加しました。

十分にわかり、理解しています...レビューモジュールを通過したのでコメントしましたが、編集してフォローアップしました!!
ポン引きジュースIT

if再実行を続けるにはどうすればよいですか?
カミルマシオロウスキ

良い点カミル。それを再帰的にするのを忘れました笑 ifステートメントでそれ自体を呼び出す関数を使用する編集で修正されました。

0

これは、bashでコマンドを繰り返すために使用するもう1つの方法です。これは、スクリプトの作成を必要とせず、多くの人に知られている可能性があるため、一部には愚かに聞こえるかもしれません。しかし、覚えておくべき構文があまりないという意味で、迅速で初心者に優しいので、言及する価値があると思います。私はこれをUbuntuのgnome-terminalでのみテストしましたが、他の端末はこれをサポートしていないかもしれません。

  1. ターミナルでコマンドを1回入力します。
  2. 改行文字を含むコマンドをマウスで選択します。
  3. Ctrl-Insertまたはコンテキストメニュー(通常は右クリックでアクセス)を使用して、選択をコピーします。
  4. Shiftキーを押しながら挿入を使用して、コマンドを実行する回数だけ貼り付けます。

各コマンドが終了するまで貼り付けるのを待つ必要はありません。貼り付けられたコマンドはキューに入り、次々に実行されます。


0

今日は生意気です。

無限ストリームの1つから読み取り、それをパイプします xargs

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

そこに少し休憩を入れる必要がある場合は、おそらく実行する必要があります sh

cat /dev/zero | xargs --null sh -c "echo hello there && sleep 3"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.